我正在尝试将非数字字符从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指令在第一行而不是第二行工作?
答案 0 :(得分:0)
对isdigit
的调用将破坏ecx
寄存器。因此,movb %cl, clean(%ebx)
存储的字节可能不是从buffer
读取的字节。
您需要保存和恢复ecx
,使用在函数调用期间保存的其他寄存器(esi
和edi
可用,尽管您需要保留它们作为函数进入和退出的一部分),或者在将字符存储到buffer
之前从clean
重新加载字符。
答案 1 :(得分:0)
我对incl %ebx
犯了一个错误。
复制值之前,我增加了存储在ebx中的索引。
此行应在movb %cl, clean(%ebx)
之后。
它确实可以相反地工作。