"error: operation size not specified"推送操作。组装 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

当我试图组装它时,我得到错误:

主要。Asm:14:错误:操作大小未指定

因此,我试图通过修改第14行来指定大小:
push byte [eax]

现在我得到了错误:

主要。Asm:14:错误:无效的操作码和操作数组合

我真的不明白这里的问题是什么。
我用来编译的命令是:

nasm -f elf32 main。Asm -o main.o

push [eax]

NASM不知道您想要压入的内存操作数的大小。您需要指定为push dword [eax].
不能使用push byte [eax],因为堆栈操作不做单个字节。

add eax, ebx-1

这是你的下一个错误!源操作数ebx-1无效。
你可以先减少EBX,然后将其添加到EAX,但正如我下面所示,你不需要这个递减。

cmp eax, [msg]
jl reverseloop

这也不是你想要的。cmp将EAX与内存中的双字进行比较,但是您希望这是地址之间的比较。使用cmp eax, msg.
为了对字符串的所有字符继续循环,只要EAX中的地址是GreaterOrEqual,您就需要有条件地跳转。味精.

mov   eax, msg
add   eax, len
reverseloop:
dec   eax
movzx ebx, byte [eax]
push  ebx
cmp   eax, msg
ja    reverseloop

现在我看不出这段代码将如何反转任何东西。这些字符以与它们在内存中的顺序相同的顺序进入堆栈(当然会穿插一些零字节)。

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

不使用堆栈的解决方案是存在的,而且通常会更好。

最新更新