帮助汇编代码

时间:2011-07-30 02:11:05

标签: assembly

我正在尝试学习汇编的各种原因,我正在尝试编写一个代码,上面写着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!

为什么这是错的? 非常感谢你的时间!

2 个答案:

答案 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)