Debugging 汇编语言中的除法(AT&;T语法)生成浮点异常

Debugging 汇编语言中的除法(AT&;T语法)生成浮点异常,debugging,assembly,x86-64,att,Debugging,Assembly,X86 64,Att,我最近在学习汇编语言,我正在尝试实现一个函数,它包含两个参数,第一个是值,第二个是长度为3的数组。然后我想分别在数组中存储值%16和(值/16)%16。但是,当我实现它时,它会生成一个浮点异常: subq $8,%rsp movq $0,%r10 movq %rdi,%rax /*store input into %rax*/ movq $16,%rbx /*store 16 into %rbx*/ idivq %rbx /*store divi

我最近在学习汇编语言,我正在尝试实现一个函数,它包含两个参数,第一个是值,第二个是长度为3的数组。然后我想分别在数组中存储值%16和(值/16)%16。但是,当我实现它时,它会生成一个浮点异常:

    subq $8,%rsp
    movq $0,%r10
    movq %rdi,%rax /*store input into %rax*/
    movq $16,%rbx  /*store 16 into %rbx*/
    idivq %rbx     /*store dividend in rax, and remainder in rdx*/

    movq %rdx,(%rsi,%r10) /*store remainder in %rsi[0]*/
    addq $1,%r10 /*increase %r10 by 1*/

    idivq %rbx /*do the division again*/
    movq %rdx,(%rsi,%r10)
    addq $8,%rsp
当我用

  char buf[16];
  hex_format_byte_as_hex("h", buf);
  ASSERT(0 == strcmp(buf, "48"));

它生成一个浮点异常。为什么会这样?有人能指出我在工作中做错了什么吗?提前感谢您。

idivq
使用单个操作数时将
rdx:rax
作为输入。您没有初始化
rdx
。初始化
rdx
最简单的方法是在
idiv
之前发出
cqo
指令。