2013-07-16 49 views
0

下面的代码:英特尔的x86的Linux大会SYS_WRITE + SYS_READ

section  .bss 

name: resb 50 

section  .text 
global   _start 

_start: 
     PUSH EBP 
     MOV EBP, ESP 
     MOV EDX, len 
     MOV ECX, msg 
     MOV EBX, 1 
     MOV EAX, 4 
     INT 0x80 
     MOV EDX, 50 
     MOV ECX, name 
     MOV EBX, 0 
     MOV EAX, 3 
     INT 0x80 
     MOV EBX, 1 
     MOV EAX, 4 
     INT 0x80 
     MOV EDX, cm 
     MOV ECX, ex 
     MOV EBX, 1 
     MOV EAX, 4 
     INT 0x80 
     MOV EBX, 0 
     MOV EAX, 1 
     INT 0x80 
section  .data 

msg   db 'Hello!',0xa 
ex   db '!',0xa 
len   equ $ - msg 
cm   equ $ - ex 

我打算做的是印刷Hello!一个简单的I/O程序,要了char和将打印%c!

输入是|和输出是:,我得到如下:

:Hello! 

:! 

|4 

:4 

:! 

如何让这个它返回以下

:Hello! 

|4 

:4! 
+2

我几年没有编写任何程序集,但是最后那些'equ's看起来像是要测量字符串 - 所以'len'应该在msg后面。 –

+1

请你可以添加评论到你的代码?即使只是对每个系统调用发表评论,都会使其更容易阅读。 – user9876

+1

您是否正在调用read()系统调用来读取文本?那会返回“4 \ n”,而不仅仅是“4”。我想你会在不删除“\ n”的情况下打印出来,这就是为什么“4”和“!”之间有一个换行符。但是我对你的代码做了一些猜测:-) – user9876

回答

1

由于Damien_The_Unbeliever说,你equ小号希望紧接在他们应该测量的弦之后。在您的sys_read,eax将是读取的字符数,包括结束阅读的换行。您可能不想打印换行符(在这种情况下 - 有时您会这样做)。所以:

mov edx, eax 
dec edx 

或者,如果你想这样做在一个指令:

lea edx, [eax - 1] 

因为它的立场,edx仍持有50,那么你的下一个sys_write将打印50个字符。它不会停在零或任何其他字符串终结符。 ecx仍将包含name,但为了清晰起见,我会重新加载它。

根据权利,您应该在每个int 0x80之后检查错误返回(eax将为负),但在此处不太可能出现错误。