【发布时间】:2017-01-27 11:44:24
【问题描述】:
我尝试使用汇编 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
【问题讨论】:
-
如果您的 user_input 缓冲区直接在内存中跟随 msg1(如上),您也可以在一次调用中将其输出为一个大字符串,即。 ecx = msg1,edx = 6+20。 (看起来对学生来说是一个很好的例子,在汇编中没有变量,但是计算机内存由连续字节组成,并且您的代码完全负责赋予它从高级语言中已知的所有“结构”含义,标签只是别名内存地址,仅此而已)。因此,通过您定义的内存布局,您将用户输入附加到内存中的 msg1 并且可以在写入期间利用