Assembly 用于反转字符串的汇编程序在打印一个字符后终止

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

我正在尝试编写一个汇编程序,它接收长度为5的字符串并打印反向字符串。我尝试使用ecx=5的循环,以相反的顺序逐个打印字符。要打印字符,我计算反向地址,然后使用子例程打印该字符

但是我的代码中似乎有一个错误,它只输出第一个字符

例如,对于给定的输入
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