在nasm汇编中接受并打印两个字符串

时间:2013-08-26 15:02:25

标签: string assembly printing nasm

我有这段代码:

section .data
   msg3 db 'Enter Two Strings: '
   msg3Len equ $ -msg3

section .bss
   string1Len resb 1
   string1 resb 0
   string2Len resb 1
   string2 resb 0

section .text
   global _start

_start:
   mov eax,4
   mov ebx,1
   mov ecx,msg3
   mov edx,msg3Len
   int 80h

   mov eax,3
   mov ebx,1
   mov ecx,string1
   int 80h

   dec al
   mov byte [string1Len], al

   mov eax,3
   mov ebx,1
   mov ecx,string2
   int 80h

   dec al
   mov byte [string2Len], al

   mov eax,4
   mov ebx,1
   mov ecx,string1
   mov edx,[string1Len]
   int 80h

   mov eax,4
   mov ebx,1
   mov ecx,string2
   mov edx,[string2Len]
   int 80h

   mov eax, 0
   mov ebx, 1
   int 80h

我在打印两个字符串时遇到问题。它打印多余和垃圾字符。而且,当我打印三个字符串时,它会打印过多的字符。看起来我的代码出了什么问题?

2 个答案:

答案 0 :(得分:0)

当您从标准输入读取string1string2时,您正在写入尚未分配的内存(至少不是为此目的)。 resb 0将保留零字节的空间(==无空格)。您应该保留与您希望阅读的最长字符串的大小一样多的空间。

另一个问题是你正在从string1Lenstring2Lenmov edx,[string1Len])读取32位,即使这些变量的大小只有一个字节 - 这意味着你将成为读取超出实际变量的3个字节。使变量dwords(使用resd)或使用movzx指令将字节零扩展为dwords(例如movzx edx,byte [string1Len])。

答案 1 :(得分:0)

正如@Michael所写,关于使用resdmovzx,这是一个更好的解决方法。

我在Ubuntu 64bit中测试过它:

; Compile with: nasm -f elf twoString.asm
; Link with (64 bit systems require elf_i386 option): ld -m elf_i386 twoString.o -o twoString
; Run with: ./twoString

SECTION .data
msg     db      'Enter Two Strings: ', 0Ah
msgLen equ $ - msg

SECTION .bss
string1:     resb    255
string2:     resb    255

SECTION .text
global  _start

_start:

    ;print msg
    mov     edx, msgLen
    mov     ecx, msg
    mov     ebx, 1
    mov     eax, 4
    int     80h

    mov     edx, 255        ; number of bytes to read
    mov     ecx, string1    ; reserved space to store our input (known as a buffer)
    mov     ebx, 0          ; write to the STDIN file
    mov     eax, 3          ; invoke SYS_READ (kernel opcode 3)
    int     80h

    mov     edx, 255        ; number of bytes to read
    mov     ecx, string2    ; reserved space to store our input (known as a buffer)
    mov     ebx, 0          ; write to the STDIN file
    mov     eax, 3          ; invoke SYS_READ (kernel opcode 3)
    int     80h

    mov     edx, 255
    mov     ecx, string1
    mov     ebx, 1
    mov     eax, 4
    int     80h

    mov     edx, 255
    mov     ecx, string2
    mov     ebx, 1
    mov     eax, 4
    int     80h
    mov     ebx, 0      ; return 0 status on exit - 'No Errors'
    mov     eax, 1      ; invoke SYS_EXIT (kernel opcode 1)
    int     80h