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
,使用在函数调用中保存的不同寄存器(esi
和 edi
可用,但您需要保留它们作为函数进入和退出的一部分),或者在将其存储在 clean
.
之前从 buffer
重新加载字符
我 incl %ebx
有误。
在复制值之前,我增加了存储在 ebx 中的索引。
此行应位于 movb %cl, clean(%ebx)
.
之后
反之亦然。
我正在尝试将不是数字的字符从字符数组 "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
,使用在函数调用中保存的不同寄存器(esi
和 edi
可用,但您需要保留它们作为函数进入和退出的一部分),或者在将其存储在 clean
.
buffer
重新加载字符
我 incl %ebx
有误。
在复制值之前,我增加了存储在 ebx 中的索引。
此行应位于 movb %cl, clean(%ebx)
.
反之亦然。