为什么我的字符串打印函数在我传递的 C 字符串之后打印额外的垃圾/文件内容?
Why does my string-print function print extra garbage / file contents after the C string I pass it?
我决定制作一个函数,将 EAX 寄存器中的字符串打印到控制台,首先显示一条消息,然后再显示一些内容
代码(NASM):
newLine equ 0xa
section .data
msg db "Hello world!", newLine, 0
section .text
global _start
_start:
mov eax, msg
call printf
call exit
printf:
push eax
push ebx
push ecx
push edx
mov ecx, eax
call lenFind
mov edx, eax
mov eax, 4
mov ebx, 1
int 0x80
pop edx
pop ecx
pop ebx
pop eax
ret
lenFind:
push edx
mov edx, 0
.find:
cmp [eax+edx], byte 0
je .close
inc edx
jmp .find
.close:
pop edx
ret
exit:
mov eax, 1
mov ebx, 0
int 80h
输出:
Hello world!
.shstrtab.text.data
�J�
我知道它可能是什么,但最有可能的问题是我使用的是 32 位寄存器
您的 lenFind 没有 return 任何结果!
长度是在 EDX
寄存器中计算的,但您已从堆栈中恢复了该长度。然而,调用程序似乎期望长度在 EAX
寄存器中:
lenFind:
push edx
mov edx, 0
.find:
cmp [eax+edx], byte 0
je .close
inc edx
jmp .find
.close:
MOV EAX, EDX <<< Add this line
pop edx
ret
我决定制作一个函数,将 EAX 寄存器中的字符串打印到控制台,首先显示一条消息,然后再显示一些内容
代码(NASM):
newLine equ 0xa
section .data
msg db "Hello world!", newLine, 0
section .text
global _start
_start:
mov eax, msg
call printf
call exit
printf:
push eax
push ebx
push ecx
push edx
mov ecx, eax
call lenFind
mov edx, eax
mov eax, 4
mov ebx, 1
int 0x80
pop edx
pop ecx
pop ebx
pop eax
ret
lenFind:
push edx
mov edx, 0
.find:
cmp [eax+edx], byte 0
je .close
inc edx
jmp .find
.close:
pop edx
ret
exit:
mov eax, 1
mov ebx, 0
int 80h
输出:
Hello world!
.shstrtab.text.data
�J�
我知道它可能是什么,但最有可能的问题是我使用的是 32 位寄存器
您的 lenFind 没有 return 任何结果!
长度是在 EDX
寄存器中计算的,但您已从堆栈中恢复了该长度。然而,调用程序似乎期望长度在 EAX
寄存器中:
lenFind:
push edx
mov edx, 0
.find:
cmp [eax+edx], byte 0
je .close
inc edx
jmp .find
.close:
MOV EAX, EDX <<< Add this line
pop edx
ret