2011-01-28 37 views
1

我对汇编语言使用those video tutorials。 我基本上试图解决“hello world”asm例子。 以下是我有:简单的汇编系统调用不起作用

.data 
str: 
     .ascii "Hello World" 

.text 
.globl _start 

_start: 
     movl $4, %eax 
     movl $1, %ebx 
     movl $str, %ecx 
     movl $11, %edx 
     int  $0x80 

     movl $1, %eax 
     movl $0, %ebx 
     int  $0x80 

这编译就好了,但是当我运行它,没有文本打印到终端。我不知道我在做什么错。无论什么价值,我进入ecx寄存器没有任何区别,没有任何反应。

另外,还有其他问题,系统调用在调用int 0x80指令时如何工作? 有些数据已被移动到寄存器,但是当我们到达系统调用时,它不会“使用”任何这些值。它是否会得到什么已被移动到它自己的寄存器?

一些系统信息可能会有所帮助:

[email protected] ~/dev/asm/tutorial > uname -a 
FreeBSD freebsd-9 5.5-RELEASE FreeBSD 5.5-RELEASE #0: Tue May 23 14:58:27 UTC 2006  [email protected]:/usr/obj/usr/src/sys/GENERIC i386 
+1

我个人认为,通过学习系统调用,“hello world”,调用约定和其他依赖于OS的功能来启动程序集是一个坏主意。我通常建议学习使用调试器并编写一些可以单步执行的自包含asm程序,例如总结一个小阵列。一旦您对基本说明感到满意并获得程序集的窍门,您就可以轻松地学习各种其他事情,从而了解系统调用甚至可能无用。但这只是我疯狂的看法:) – Jester 2011-01-29 02:11:45

回答

0

您必须%EBX设置为0(标准输出)。您当前的值(1)表示stdin。

+0

这是退出系统调用状态参数,而不是我正在写的FD。 – dotminic 2011-01-28 19:25:04

+0

stdin为0,stdout为1 stderr为2 – 2011-01-31 20:54:44

+0

@Fire Crow:在linux上stdin是1,stdout是0.我没有看到他正在运行freeBsd。 – BlackBear 2011-01-31 21:11:43

1

FreeBSD有越 '通常' 调用 约定,其中所述系统调用号码 是在EAX,和参数是上 堆栈

检查在这个hello world的freebsd部分中汇编totorial

我去了ubuntu和netbsd之间,这帮助我写程序集

* bsd使用一个堆栈来存储文件des的参数和要写入的字节的长度,在Linux中它只是保存在寄存器eax和这是linux风格的ebx,就像你在你的例子中那样。

在linux: _start:;告诉接头入口点 MOV EDX,LEN;消息长度 MOV ECX,MSG;消息写 MOV EBX,1;文件描述符(STDOUT) MOV EAX,4;系统来电号码(SYS_WRITE) INT 0x80的;调用内核在freebsd

_syscall: 
    int0x80;system call 
    ret 

_start:;tell linker entry point 

    pushd word len;message length 
    pushd word msg;message to write 
    pushd word 1;file descriptor (stdout) 
    move ax,0x4;system call number (sys_write) 
    call _syscall;call kernel 

使用系统调用堆栈版本在* BSD