我尝试使用程序集x86编写简单的问候语程序,该程序取用户名并打印输出" Hello [userName]" 问题是打印问候语时,用户名的第一个字符加倍,例如:
输入:
Black Knight
输出:
Hello BBlack Knight
这是我的代码
global _start
section .data
msg1 db "Hello "
user_input times 20 db 0
section .bss
section .text
_start :
; read
mov eax , 3
mov ebx , 0
mov ecx , user_input
mov edx , 20
int 0x80
; write
mov eax , 4
mov ebx , 1
mov ecx , msg1
mov edx , 7
int 0x80
mov eax , 4
mov ebx , 1
mov ecx , user_input
mov edx , 20
int 0x80
; exit
mov eax , 1
mov ebx , 0
int 0x80
答案 0 :(得分:2)
因为这段代码而发生这种情况:
; write
mov eax , 4
mov ebx , 1
mov ecx , msg1
mov edx , 7
int 0x80
你在这里告诉写指令,打印的字符串长度为7个字节,实际上是6个。
为什么加倍B?因为在内存中,输入的名称从msg1
后面的字节开始显示。
您可以通过仅打印6个字符(Hello +空格)或在msg
值的末尾添加空终止符来解决此问题。