在div指令

时间:2015-07-17 00:17:16

标签: assembly division i386

我最近一直在玩装配,当我尝试使用div指令时,我遇到Floating exception。我在网上搜索过去一两天没有任何工作。我看到了this question,由于答案,我在三个xorq指令中将寄存器归零(特别是rdx,因为它是被除数的高字节),但它仍然没有帮助。当使用gcc -S myProg.c编译简单执行模数运算的ac程序(并创建一些变量以便编译器不会优化模数)时,gcc会创建一个具有cltd的汇编文件(在idivl之前转换signed signed to signed long double)指令。我也在我的程序中尝试过,但它改变了一切。我也尝试在rax ans rbx中使用不同的尺寸值,但它仍然无效。

问题:我做错了什么,以及使用div指令有什么奇怪的怪癖? This是我用于学习汇编的文档。

在我的下面的代码中,函数print只打印rax的内容。我不在乎打印什么,只是打印了一些东西,所以我可以看到哪个指令崩溃了。

.cstring
    _format: .asciz "%d\n"

.text
.globl _main
_main:
    # program setup
    pushq   %rbp
    movq    %rsp, %rbp

    # program - 16 byte aligned already
    # zero out the registers
    xorq    %rax, %rax
    xorq    %rdx, %rdx
    xorq    %rbx, %rbx

    # set the values to use in the division
    movq    $5, %rax
    movq    $16, %rbx

#   cltd    # 'gcc -S' command puts in cltd before idivl 
    call    print
    idivl   %ebx, %eax     ########### CRASH HERE
    call    print

    # program cleanup
    popq    %rbp
    ret

# prints value in %rax (could be junk, I don't care. As long as something is printed)
print:
    subq    $8, %rsp    # for 16 byte alignment
    lea     _format(%rip), %rdi
    movq    %rax, %rsi
    call    _printf
    addq    $8, %rsp
    ret

0 个答案:

没有答案