我是汇编编程的新手,我在PC上运行汇编程序时遇到了困难。我不太了解运行程序的过程。我正在做的是尝试运行一个" HELLO WORLD"计划如下。
#include <asm/unistd.h>
#include <syscall.h>
#define STDOUT 1
.data
hello:
.ascii "hello world\n"
helloend:
.text
.globl _start
_start:
movl $(SYS_write),%eax // SYS_write = 4
movl $(STDOUT),%ebx // fd
movl $hello,%ecx // buf
movl $(helloend-hello),%edx // count
int $0x80
movl $(SYS_exit),%eax
xorl %ebx,%ebx
int $0x80
ret
很抱歉没有添加评论,因为我自己并不了解大部分内容。我只是想在我的电脑上设置环境,以便我可以学习装配。
要运行上面的代码,我首先将文件保存为&#34; hello.S&#34;。 然后打开当前目录中的终端,运行以下命令:
/lib/cpp hello.S hello.s
as -o hello.o hello.s //to generate an object file named hello.o
ld hello.o
./a.out
但是在运行可执行文件后,我没有按预期看到结果。我的意思是该程序应打印出来&#34; hello world&#34;,但我不会得到任何结果或任何错误消息。我知道该程序是正确的。因此,我的系统或运行程序的方式一定存在问题。
为什么在运行可执行文件a.out后没有得到任何结果?
答案 0 :(得分:0)
通常情况下,让gcc进行繁重的提升&#34;。另请注意,如果您使用64位Linux并尝试组装和运行32位代码,则可能需要提供-m32
以生成32位代码。
无论如何,我拿了你的代码,编译并运行如下:
linux:~/scratch> cat hello.S
#include <asm/unistd.h>
#include <syscall.h>
#define STDOUT 1
.data
hello:
.ascii "hello world\n"
helloend:
.text
.globl _start
_start:
movl $(SYS_write),%eax // SYS_write = 4
movl $(STDOUT),%ebx // fd
movl $hello,%ecx // buf
movl $(helloend-hello),%edx // count
int $0x80
movl $(SYS_exit),%eax
xorl %ebx,%ebx
int $0x80
ret
linux:~/scratch> gcc -m32 -nostartfiles -nodefaultlibs hello.S
linux:~/scratch> ./a.out
hello world
linux:~/scratch>