mov指令不能以其他方式工作

mov instruction doesn't work other way around

我正在尝试将不是数字的字符从字符数组 "buffer" 移动到新数组 "clean"。 "buffer"是使用scanf函数创建的。

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

...

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


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

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

有疑问的是这两行。

movb buffer(%ebx), %cl

movb %cl, clean(%ebx)

第一行将buffer中的某个字符存入cl。 然而,第二行不采取任何行动。即使当我检查 gdb 时,也没有任何值存储在 clean 中。

为什么mov指令在第一行有效,而在第二行无效?

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

读取的字节

您需要保存和恢复 ecx,使用在函数调用中保存的不同寄存器(esiedi 可用,但您需要保留它们作为函数进入和退出的一部分),或者在将其存储在 clean.

之前从 buffer 重新加载字符

incl %ebx 有误。 在复制值之前,我增加了存储在 ebx 中的索引。 此行应位于 movb %cl, clean(%ebx).

之后

反之亦然。