我正在尝试学习汇编的各种原因,我正在尝试编写一个代码,上面写着hello bla bla bla 然后读取你的名字,打印你的名字,并说更多bla bla bla 但是在得到你的名字后它没有显示文字 我确定它有点蠢......对不起......
这是我到目前为止所做的:
.section .bss
.lcomm bufname, 256
.section .data
msg1:
.ascii "Hello, please enter your name!\n" # Message to write
len1 = . - msg1 # Length of string
msg2:
.ascii "Good to meet you "
len2 = . - msg2
msg3:
.ascii ". Iam your first assembly program!\n"
len3 = . - msg3
.section .text
.globl _start
_start:
call get_name
get_name:
#should print msg1
mov $4, %eax # system call number (sys_write)
mov $1, %ebx # file descriptor (stdout)
mov $msg1, %ecx # Message to write
mov $len1, %edx # Lenght of message
int $0x80 # Call kernel
#should get user input
mov $3, %eax # System call number (sys_read)
mov $0, %ebx # File descriptor (stdin)
mov $bufname, %ecx # Buffer to store the name
mov $256, %edx # Lenght of buffer
int $0x80
#should print msg2
mov $4, %eax
mov $1, %ebx
mov $msg2, %ecx
mov $len2, %edx
int $0x80
#should print bufname (doesn't)
mov $bufname, %ecx
mov $256, %edx
int $0x80
#should print msg3 (doesn't)
mov $msg3, %ecx
mov $len3, %edx
int $0x80
call exit
exit:
mov $1, %eax
mov $0, %ebx
int $0x80
编译我使用
as Jes.s -o Jes.o
ld Jes.o -o Jes
这是我得到的输出
$ ./Jes
Hello, please enter your name!
renato
Good to meet you
它应该显示
Good to meet you renato. Iam your first assembly program!
为什么这是错的? 非常感谢你的时间!
答案 0 :(得分:2)
当您打印名称时,您假设EAX和EBX与之前的sys_write相同。情况可能并非如此。
此外,您在写入名称时传递缓冲区的长度。你确定你不应该只传递名字的长度吗? sys_read应该返回读取的长度。 (您可能需要在打印msg2时将其保存在某处。)
答案 1 :(得分:1)
问题在于,当您调用中断(int
)时,寄存器可能会被覆盖。这不像是在为您保存和恢复寄存器的函数调用。您需要在所有int
来电之前放置这些行的副本:
mov $4, %eax # system call number (sys_write)
mov $1, %ebx # file descriptor (stdout)