mov指令无法正常工作

时间:2019-05-23 03:24:12

标签: assembly x86 att

我正在尝试将非数字字符从char数组“ buffer”移到新数组“ clean”。通过使用scanf函数创建“缓冲区”。

    .section bss
buffer:
    .skip 20
clean:
    .skip 20

...

if_digit:
    movl    $0, %ebx
cleanloop:  
    movl    $0, %ecx
    movb    buffer(%ebx), %cl
    pushl   %ecx
    call    isdigit     #nonzero if digit.
    addl    $4, %esp
    incl    %ebx
    cmpl    $0, %eax
    jne clean_buffer    #jmp to clean_buffer if digit
    jmp end_cleanloop


clean_buffer:   
    movb    %cl, clean(%ebx)
    jmp     cleanloop

end_cleanloop:
    movb    $0, clean(%ebx) #add null character at the end.     
    pushl   $clean
    call    atoi        #stores atoi value at eax
    addl    $4, %esp
    subl    $4, iIndex  
    pushl   %eax
    jmp     input

关于这两行的问题。

movb buffer(%ebx), %cl

vs

movb %cl, clean(%ebx)

第一行将特定字符存储在cl的缓冲区中。 但是,第二行不采取任何措施。即使我使用gdb检查,也没有干净地存储任何值。

为什么mov指令在第一行而不是第二行工作?

2 个答案:

答案 0 :(得分:0)

isdigit的调用将破坏ecx寄存器。因此,movb %cl, clean(%ebx)存储的字节可能不是从buffer读取的字节。

您需要保存和恢复ecx,使用在函数调用期间保存的其他寄存器(esiedi可用,尽管您需要保留它们作为函数进入和退出的一部分),或者在将字符存储到buffer之前从clean重新加载字符。

答案 1 :(得分:0)

我对incl %ebx犯了一个错误。 复制值之前,我增加了存储在ebx中的索引。 此行应在movb %cl, clean(%ebx)之后。

它确实可以相反地工作。