我正在关注汇编语言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
答案 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)表示标准输入。