我正在嘗試撰寫一個接收字串、查看每個字母并用大寫元音替換小寫元音的子例程。我在帶有 NASM 的 VM 上使用樹莓派桌面 (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 上找到的檔案沒有那么有用。它說我可以使用引數,但不知道如何使用。(如果我嘗試將暫存器作為引數,由于運算元/運算子錯誤,它不會組裝。)
uj5u.com熱心網友回復:
lodsb ; 將下一個位元組加載到 AL 中并增加EIP
說這條指令增加 EIP 是沒有意義的。每條指令都會對 EIP 產生影響。也許你的意思是說lodsb增加 ESI?
看到該dec ESI指令,我假設您在 32 位模式下作業,DS通常等于ES.
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 在某些時候會觸發分段錯誤。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/495923.html
