[英]Segmentation fault for STOSB in NASM
我正在尝试编写一个子例程,它接受一个字符串,查看每个字母,并将小写元音替换为大写元音。 我在带有 NASM 的虚拟机上使用树莓派桌面 (x86)。 这是我的代码的一部分:
again:
lodsb ; load next byte into AL and increment EIP
cmp AL, 0 ; check for end
jz quitloop ; exit if end
cmp AL, 'a' ; check if char is a
jnz next1 ; jump to next test if not a
dec ESI ; move back to address of character
mov AL, 'A' ; replace character
stosb ; store character
jmp again ; restart loop with next char
“next1”检查 'e' 直到 y。 据我所知,lodsb 似乎可以正常工作,因为对于以“the”开头的字符串,它会循环遍历所有测试两次,然后在 test1 中出现分段错误(检查 e)。 我在 STOSB 上找到的文档没有多大帮助; 它说我可以使用参数,但不知道如何使用。 (如果我尝试将寄存器作为参数,它不会因为操作数/运算符错误而汇编。)
lodsb; 将下一个字节加载到 AL 并递增EIP
该指令递增 EIP 对 state 没有结果。 每条指令都会对 EIP 产生影响。 也许您的意思是说lodsb
会增加 ESI?
看到dec ESI
指令,我假设您在DS
通常等于ES
的 32 位模式下工作。
lodsb
字符串原语从DS:ESI
开始工作,而stosb
从ES:EDI
开始工作。
如果您打算就地大写,那么简单的解决方案是在 ESI 指向的地址之前写上大写元音:
again:
lodsb ; load next byte into AL and increment EIP
cmp AL, 0 ; check for end
jz quitloop ; exit if end
cmp AL, 'a' ; check if char is a
jnz next1 ; jump to next test if not a
mov byte [ESI - 1], 'A' ; replace character
jmp again ; restart loop with next char
请注意, dec ESI
指令与未有效更改小字符一起引发了无限循环!
并且因为stosb
指令愉快地运行,在某个时候 EDI 将触发分段错误。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.