[英]"error: operation size not specified" on push operation. Assembly x86
我正在嘗試制作一個簡單的 x86 程序來反轉字符串,在本例中為:“ciao”。
section .data
msg db "ciao"
len equ $ - msg
section .text
global _start
_start:
lea eax, [msg]
mov ebx, len
add eax, ebx-1
reverseloop:
push [eax]
sub eax, 1
cmp eax, [msg]
jl reverseloop
當我嘗試組裝它時,出現錯誤:
main.asm:14: 錯誤:未指定操作大小
因此,我嘗試通過將第 14 行修改為:
push byte [eax]
現在我得到了錯誤:
main.asm:14: 錯誤:操作碼和操作數的組合無效
我真的不明白這里有什么問題。
我用來編譯的命令是:
nasm -f elf32 main.asm -o main.o
push [eax]
NASM 不知道您要推送的 memory 操作數的大小。 您需要將其指定為push dword [eax]
。
使用push byte [eax]
不是一個選項,因為堆棧操作不執行單個字節。
add eax, ebx-1
這是你的下一個錯誤! 源操作數ebx-1
無效。
您可以先遞減 EBX,然后將其添加到 EAX,但正如我將在下面展示的那樣,您不需要這種遞減。
cmp eax, [msg] jl reverseloop
這也不是你想要的。 cmp
將 EAX 與來自 memory 的雙字進行比較,但您希望這是地址之間的比較。 使用cmp eax, msg
。
為了繼續循環字符串的所有字符,只要 EAX 中的地址為GreaterOrEqual msg ,就需要有條件地跳轉。
mov eax, msg
add eax, len
reverseloop:
dec eax
movzx ebx, byte [eax]
push ebx
cmp eax, msg
ja reverseloop
現在我看不出這段代碼如何逆轉任何事情。 這些字符以與 memory 中相同的順序落在堆棧上(當然散布着一些零字節)。
mov eax, msg
mov ecx, len
reverseloop1:
movzx ebx, byte [eax]
push ebx
inc eax
dec ecx
jnz reverseloop1
mov eax, msg
mov ecx, len
reverseloop2:
pop ebx
mov [eax], bl
inc eax
dec ecx
jnz reverseloop2
不使用堆棧的解決方案存在並且通常會更好。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.