我的代码需要有一个将打印到控制台的字符串,以及一个字符串长度计数程序,该程序将对其进行计数,而不是手动将字符串长度放入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函数,并为换行符创建一个新寄存器