- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我目前正在编写一个简单的 C 编译器,它将 .c 文件作为输入并生成汇编代码(X86、AT&T 语法)。一切都很好,但是当我尝试执行 IDIVQ 指令时,出现浮点异常。这是我的输入:
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.html , idivq %rbx 应该在 %rax 中产生 6/d(商)。但是我得到一个浮点异常,我似乎找不到问题所在。
任何帮助将不胜感激!
最佳答案
Mysticials 答案的第一部分是正确的,idiv
做了 128/64 位除法,所以 rdx
的值,它保存了被除数的高 64 位不得包含随机值。但是零扩展是错误的方法。
因为您有签名变量,您需要签名将rax
扩展为rdx:rax
。对此有一个特定的指令,AT&T 中的 cqto
(convert quad to oct)和 Intel 语法中的 cqo
。 AFAIK 较新版本的 gas 接受这两个名称。
movq %rdx, %rbx
cqto # sign extend rax to rdx:rax
idivq %rbx
关于c - X86 汇编 - 处理 IDIV 指令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10343155/
看看这段代码 int main() { int i = 1U << 31; // assume this yields INT_MIN volatile int x; x =
在 intel 指令中,idiv(integer divsion) 表示有符号除法。 我得到了 idiv 的结果,但我不太明白结果。 - 示例 0xffff0000 idiv 0xffff1100 -
我正在尝试让 idiv 正常工作,并且我已经读到您输入了您想要划分的内容例如 25,然后在 ebx 中输入您想要除以的内容,例如 5,然后就可以了 idiv ebx 然后将 EAX = 5 和 EDX
据我所知,idiv %ebx 会将 edx:eax(按顺序连接成 64 位值)与 32 位 ebx. 但是,当我尝试将 0x00000000:0xfffffffb(0 和 -5)除以 0xffffff
我目前正在编写一个简单的 C 编译器,它将 .c 文件作为输入并生成汇编代码(X86、AT&T 语法)。一切都很好,但是当我尝试执行 IDIVQ 指令时,出现浮点异常。这是我的输入: int myma
我想知道这是否适用于 Krait 400 CPU。我听从了一些建议 here 当我使用 mcpu=cortexa15 编译时,代码会编译并有效地在程序集转储中看到 udiv 指令。 但是,我想知道:
我正在帮助我的一个 friend 调试他的程序,我们将其缩小到一个甚至在这里也会发生的问题: .MODEL small .STACK 16 .CODE start: mov ax, 044c0
我在这里使用 Visual C++ 2008 (9.x),当我遇到编译器生成 DIV 而不是 IDIV 时,我正在准备一个定点值。我将代码折叠成一小段以准确重现: short a = -255; sh
我正在处理经常使用一些重要优化的代码。 是什么 #define idiv(a, b) (((a) + (b) / 2) / (b)) 用于?为什么不简单 #define idiv(a, b) ((a)
谁能为我解释为什么在这些情况下余数的符号不同?这是模拟器错误还是真正的 CPU 也会这样做? 8 / -3 : quotient(AL) = -2 remainder(AH) = 2 -8 / 3
我是一名优秀的程序员,十分优秀!