我试图在linux上学习汇编编程,所以我用google搜索/创建了一个非常简单的" cat"的实现,但是我的小程序无法使用命令行参数(它说" Colud打开文件")。当我取消注释" fname" line,它工作,所以文件I / O很好。所以我觉得堆栈部分坏了:/这是我的代码:
.code32
.section .data
msg_err_open:
.asciz "Colud't open the file.\n"
msg_err_open_len:
.long . - msg_err_open
fname:
.asciz "test.txt"
.section .bss
.equ BUFSIZE, 1024
.lcomm buf, BUFSIZE
.section .text
.globl _start
.align 4
_start:
# popl %ebx # argc
# popl %ebx # argv[0]
# popl %ebx # argv[1] (file)
# open
movl $5, %eax # open(
# movl 8(%esp), %ebx # filename, ????????????????
movl $fname, %ebx
movl $0, %ecx # readonly
int $0x80 # )
test %eax, %eax # megnyitás sikerült?
js err_open # ha negatív
# read
movl %eax, %ebx # file descriptor eax->ebx
movl $3, %eax # read( fd (ebx),
movl $buf, %ecx # buffer,
movl $BUFSIZE, %edx # size
int $0x80 # )
# close
movl $6, %eax # close( fd (ebx)
int $0x80 # )
# write
movl $4, %eax # write(
movl $1, %ebx # STDOUT,
movl $buf, %ecx # buffer
int $0x80 #)
# exit
movl $1, %eax # exit(
movl $0, %ebx # 0
int $0x80 # )
err_open:
# write (msg_err_open)
movl $4, %eax
movl $1, %ebx
movl $msg_err_open, %ecx
movl $msg_err_open_len, %edx # length
int $0x80
# exit(1)
movl $1, %eax
movl $1, %ebx
int $0x80
我用这种方式补充/链接:
as pfile.S -o pfile.o
ld pfile.o -o pfile
我的Linux发行版是:
Debian 3.2.41-2+deb7u2
AS版:
2.22 (x86_64-linux-gnu)
我认为解决方案很简单,但我没有看到它。我想让它在32位模式下运行,x64对我来说非常难。谢谢你的时间!
答案 0 :(得分:2)
哦,我看到了问题。很高兴您已经包含了如何构建程序(+1)。
如果使用file
命令检查生成的可执行文件,我敢打赌它是64位:
$ file pfile
pfile: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), statically linked, not stripped
要制作32位程序,您应该使用:
$ as --32 pfile.S -o pfile.o
$ ld -melf_i386 pfile.o -o pfile
$ file pfile
pfile: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), statically linked, not stripped
$ ./pfile pfile.S
.code32
.section .data
...
或者你可以gcc -m32 -nostdlib pfile.S -o pfile