Linux AT& T命令行参数

时间:2014-03-25 00:01:44

标签: linux assembly command-line stack

我试图在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对我来说非常难。谢谢你的时间!

1 个答案:

答案 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