我正在尝试制作一个简单的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
当我试图组装它时,我得到错误:
因此,我试图通过修改第14行来指定大小:主要。Asm: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
不使用堆栈的解决方案是存在的,而且通常会更好。