简单的汇编系统调用无法正常工作

时间:2011-01-28 19:12:35

标签: assembly x86 freebsd

我正在关注汇编语言those video tutorials。 我基本上试图找出“你好世界”的例子。 这就是我所拥有的:

.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指令时syscall如何工作? 有些数据已移至寄存器,但当我们进入系统调用时,它不会“使用”任何这些值。是否可以自行获取那些寄存器?

可能有用的一些系统信息:

dominic-@-freebsd-9 ~/dev/asm/tutorial > uname -a
FreeBSD freebsd-9 5.5-RELEASE FreeBSD 5.5-RELEASE #0: Tue May 23 14:58:27 UTC 2006     root@perseus.cse.buffalo.edu:/usr/obj/usr/src/sys/GENERIC  i386

3 个答案:

答案 0 :(得分:1)

我认为你需要Linux仿真来实现这一点。有关详细信息,请查看Developer's Handbook

答案 1 :(得分:1)

  

FreeBSD有更“通常”的呼叫   约定,其中系统调用号   在eax中,参数打开   堆栈

在程序集中查看此hello世界的freebsd部分

我介于ubuntu和netbsd之间,这有助于我为两个编写程序集

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

在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

上使用syscalls的堆栈版本

答案 2 :(得分:0)

您需要将%ebx设置为0(标准输出)。您当前的值(1)表示标准输入。