Assembly 用于反转字符串的汇编程序在打印一个字符后终止
我正在尝试编写一个汇编程序,它接收长度为5的字符串并打印反向字符串。我尝试使用ecx=5的循环,以相反的顺序逐个打印字符。要打印字符,我计算反向地址,然后使用子例程打印该字符 但是我的代码中似乎有一个错误,它只输出第一个字符 例如,对于给定的输入Assembly 用于反转字符串的汇编程序在打印一个字符后终止,assembly,x86,nasm,Assembly,X86,Nasm,我正在尝试编写一个汇编程序,它接收长度为5的字符串并打印反向字符串。我尝试使用ecx=5的循环,以相反的顺序逐个打印字符。要打印字符,我计算反向地址,然后使用子例程打印该字符 但是我的代码中似乎有一个错误,它只输出第一个字符 例如,对于给定的输入12345我将1作为输出,但我希望它打印54331 segment .bss INPT: resb 5 segment .text global asm_main asm_main: mov eax, 3
12345
我将1
作为输出,但我希望它打印54331
segment .bss
INPT: resb 5
segment .text
global asm_main
asm_main:
mov eax, 3 ; system call no (sys_read = 3)
mov ebx, 1 ; std_in = 1
mov ecx, INPT ; ptr to location to store input (INPT)
mov edx, 5 ; no of bytes to read
int 0x80 ; issue a system call
mov ecx, 5
swap:
mov edx, -8
imul edx, ecx
add edx, 40
add edx, INPT ; address of next byte to print = [INPT + 5 * 8 - ecx * 8]
call print
loop swap
jmp exit
print:
push ecx
mov eax, 4
mov ebx, 1
mov ecx, edx
mov edx, 1
int 0x80
pop ecx
ret
exit:
mov eax, 1
xor ebx, ebx
int 0x80
这将保留5个字节。
但这一计算还有下一条评论
);要打印的下一个字节的地址=[INPT+5*8-ecx*8]
需要qword元素
即使您通过将-8更改为-1来纠正上述问题,您仍然无法反转输入!一个leaecx[INPT+ecx-1]
就可以做到这一点
另外请注意,STDIN
=0,sys\u read
返回一个您应该使用的计数,而不是固定的数字5。也不要使用慢速
循环
指令,为什么不在ECX
寄存器中调用print并准备好地址。最后,您可以使用一个寄存器进行循环,该寄存器不会被随后的调用破坏。这节省了推和弹出的时间 要反转打印,请使用以下命令:
asm_main:
mov eax, 3 ; system call no (sys_read = 3)
xor ebx, ebx ; std_in = 0
mov ecx, INPT ; ptr to location to store input (INPT)
mov edx, 5 ; no of bytes to read
int 0x80 ; -> EAX
mov edi, eax
swap:
lea ecx, [INPT + edi - 1] ; address of next byte to print in reverse order
call print
dec edi
jnz swap
jmp exit
print:
mov eax, 4
mov ebx, 1
mov edx, 1
int 0x80
ret
exit:
mov eax, 1
xor ebx, ebx
int 0x80
asm_main:
mov eax, 3 ; system call no (sys_read = 3)
xor ebx, ebx ; std_in = 0
mov ecx, INPT ; ptr to location to store input (INPT)
mov edx, 5 ; no of bytes to read
int 0x80 ; -> EAX
mov edi, eax
swap:
lea ecx, [INPT + edi - 1] ; address of next byte to print in reverse order
call print
dec edi
jnz swap
jmp exit
print:
mov eax, 4
mov ebx, 1
mov edx, 1
int 0x80
ret
exit:
mov eax, 1
xor ebx, ebx
int 0x80