我正在学习汇编语言中的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寄存器中的哪个值都没有区别,什么都不会发生。
还有另一个问题,当syscall调用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发布于 2011-01-29 03:20:00
我认为您需要Linux仿真才能使其工作。有关详细信息,请查看Developer's Handbook。
发布于 2011-02-01 04:51:34
FreeBSD有更常见的调用约定,其中syscall号在eax中,参数在堆栈中
请查看这个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中:
_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使用堆栈版本
发布于 2011-01-29 03:15:47
您需要将%ebx设置为0(标准输出)。您的当前值(1)表示stdin。
https://stackoverflow.com/questions/4832107
复制相似问题