首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >简单程序集syscall不起作用

简单程序集syscall不起作用
EN

Stack Overflow用户
提问于 2011-01-29 03:12:35
回答 3查看 1.6K关注 0票数 1

我正在学习汇编语言中的those video tutorials。我基本上是在尝试解决"hello world“的asm示例。下面是我得到的信息:

代码语言:javascript
复制
.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寄存器中的哪个值都没有区别,什么都不会发生。

还有另一个问题,当syscall调用int 0x80指令时,它是如何工作的?一些数据已经被移动到寄存器中,但是当我们到达syscall时,它不会“使用”任何这些值。它会自己去获取已移动到这些寄存器的内容吗?

一些可能对您有帮助的系统信息:

代码语言:javascript
复制
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
EN

回答 3

Stack Overflow用户

发布于 2011-01-29 03:20:00

我认为您需要Linux仿真才能使其工作。有关详细信息,请查看Developer's Handbook

票数 1
EN

Stack Overflow用户

发布于 2011-02-01 04:51:34

FreeBSD有更常见的调用约定,其中syscall号在eax中,参数在堆栈中

  • http://asm.sourceforge.net/intro/hello.html

请查看这个hello world中的freebsd部分

我在ubuntu和netbsd之间转来转去,这帮助我为这两者编写了汇编程序。

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

在linux中:_start:;tell链接器入口点mov edx,len;消息长度mov ecx,msg;写入mov ebx的消息,1;文件描述符(stdout) mov eax,4;系统调用号(sys_write) int 0x80;调用内核

在freebsd中:

代码语言:javascript
复制
_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上的syscall使用堆栈版本

票数 1
EN

Stack Overflow用户

发布于 2011-01-29 03:15:47

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4832107

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档