簡體   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