gpt4 book ai didi

c - X86 汇编 - 处理 IDIV 指令

转载 作者:太空狗 更新时间:2023-10-29 16:25:57 27 4
gpt4 key购买 nike

我目前正在编写一个简单的 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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com