我有这段代码:
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
我在打印两个字符串时遇到问题。它打印多余和垃圾字符。而且,当我打印三个字符串时,它会打印过多的字符。看起来我的代码出了什么问题?
答案 0 :(得分:0)
当您从标准输入读取string1
和string2
时,您正在写入尚未分配的内存(至少不是为此目的)。 resb 0
将保留零字节的空间(==无空格)。您应该保留与您希望阅读的最长字符串的大小一样多的空间。
另一个问题是你正在从string1Len
和string2Len
(mov edx,[string1Len]
)读取32位,即使这些变量的大小只有一个字节 - 这意味着你将成为读取超出实际变量的3个字节。使变量dwords(使用resd
)或使用movzx
指令将字节零扩展为dwords(例如movzx edx,byte [string1Len]
)。
答案 1 :(得分:0)
正如@Michael所写,关于使用resd
或movzx
,这是一个更好的解决方法。
我在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