X86 程序集 - 处理 IDIV 指令 [英] X86 assembly - Handling the IDIV instruction

查看:22
本文介绍了X86 程序集 - 处理 IDIV 指令的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我目前正在编写一个简单的 C 编译器,它将 .c 文件作为输入并生成汇编代码(X86、AT&T 语法).一切都很好,但是当我尝试执行 IDIVQ 指令时,我得到了一个浮点异常.这是我的输入:

I am currently writing a simple C compiler, that takes a .c file as input and generates assembly code (X86, AT&T syntax). Everyting is good, but when I try to execute a IDIVQ instruction, I get a floating-point exception. Here's my input:

int mymain(int x){
  int d;
  int e;
  d = 3;
  e = 6 / d;
  return e;
}

这是我生成的代码:

mymain:
.LFB1:
    .cfi_startproc
    pushq   %rbp
    .cfi_def_cfa_offset 16
    movq    %rsp, %rbp
    .cfi_offset 6, -16
    .cfi_def_cfa_register 6
    movq    %rdi, -40(%rbp)
    movq    $3, -8(%rbp)
    movq    $6, %rax
    movq    -8(%rbp), %rdx
    movq    %rdx, %rbx
    idivq   %rbx
    movq    %rax, -16(%rbp)
    movq    -16(%rbp), %rax
    leave
    .cfi_def_cfa 7, 8
    ret
    .cfi_endproc
.LFE1:
    .size mymain, .-mymain

根据http://www.cs.virginia.edu/~evans/cs216/guides/x86.htmlidivq %rbx 应该在 %rax 中产生 6/d(商).但是我遇到了一个浮点异常,而且我似乎找不到问题所在.

According to http://www.cs.virginia.edu/~evans/cs216/guides/x86.html, idivq %rbx should produce 6/d (the quotient) in %rax. But I'm getting a floating-point exception, and I can't seem to find the problem.

任何帮助将不胜感激!

推荐答案

Mysticials 第一部分回答正确,idiv做了128/64位除法,所以rdx的值,它保存被除数的高 64 位,不能包含随机值.但是零扩展是错误的方法.

The first part of Mysticials answer is correct, idiv does a 128/64 bit division, so the value of rdx, which holds the upper 64 bit from the dividend must not contain a random value. But a zero extension is the wrong way to go.

由于您有 signed 变量,您需要 signrax 扩展为 rdx:rax.对此有一个特定的指令,AT&T 中的 cqto (convert quad to oct) 和 Intel 语法中的 cqo.AFAIK 较新版本的气体接受这两个名称.

As you have signed variables, you need to sign extend rax to rdx:rax. There is a specific instruction for this, cqto (convert quad to oct) in AT&T and cqo in Intel syntax. AFAIK newer versions of gas accept both names.

movq    %rdx, %rbx
cqto                  # sign extend rax to rdx:rax
idivq   %rbx

这篇关于X86 程序集 - 处理 IDIV 指令的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆