繁体   English   中英

NASM 中 STOSB 的分段错误

[英]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开始工作,而stosbES: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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM