在x86汇编语言中打印字符串时出现奇怪字符



我的代码需要有一个将打印到控制台的字符串,以及一个字符串长度计数程序,该程序将对其进行计数,而不是手动将字符串长度放入edx寄存器。但是字符串刚打印出来,我就打印出了奇怪的字符。


global          _start
section         .text
_start:
mov           edi, message
call          _strlen
mov           edx, eax
mov           eax, 4
mov           ebx, 1
mov           ecx, message
int 80h
mov           eax, 1
mov           ebx, 5
int 80h
section         .data
message: db     "My name is Stanley Hudson", 0Ah
_strlen:
push          ebx
push          ecx
mov           ebx, edi
xor           al, al
mov           ecx, 0xffffffff
repne         scasb               ; REPeat while Not Equal [edi] != al
sub           edi, ebx            ; length = offset of (edi – ebx)
mov           eax, edi
pop           ebx
pop           ecx
ret

这是输出

strlen搜索终止字符串的0字节,但您的字符串没有,所以它会一直搜索,直到找到一个0字节并返回一个太大的值。

你想写

message: db     "My name is Stanley Hudson", 0Ah, 0
; ^^^

另一个错误是,您的_strlen函数显然位于.data部分,因为您没有在字符串之后返回到section .text。x86-32没有NX位,所以.data部分是可执行的,一切都可以运行,但这肯定不是你想要的。

要去掉特殊字符,请在启动进程之前编写strlen函数,并为换行符创建一个新寄存器

最新更新