汇编程序/ GAS / Linux x86_64 - 读取文件时出错

时间:2014-04-03 16:44:31

标签: gas

我正在Linux x86_64(GAS语法)上用汇编程序编写一个简单的程序。我必须读取一个用二进制编码编码并保存在文本文件中的数字。所以,我有我的文本文件“data.txt”(它与我的源文件位于同一目录中),下面是我代码中最重要的片段:

SYS_WRITE               = 4
EXIT_SUCCESS            = 0
SYS_READ                = 3
SYS_OPEN                = 5

.data
BIN_LEN = 24
.comm BIN, BIN_LEN
BIN: .space BIN_LEN, 0

.text
PATH: .ascii "data.txt\0"

.global _start
_start:

    mov $SYS_OPEN, %eax     # open
    mov $PATH, %ebx         # path
    mov $0, %ecx                # read only
    mov $0666, %edx            # mode
    int $0x80                   # call (open file)

    mov $SYS_READ, %eax     # reading
    mov $3, %ebx                # descriptor 
    mov $BIN, %ecx              # bufor
    mov $BIN_LEN, %edx          # bufor size
    int $0x80                   # call (read line from file)

调用第二个系统调用后,%eax寄存器应包含读取字节数。 在我的文件“data.txt”中我有“10101”,但是当我使用gdb调试我的程序时,它显示的是-11 in%eax,因此出现了某种错误。但我确信“10101”被加载到缓冲区(BIN),因为当我想显示缓冲区内部的内容时,文件中有正确的编号。我需要进一步算法的读取字节数。我不知道为什么%eax包含错误代码而不是加载到缓冲区的字节数。我想知道它是否可能与使用32位寄存器调用syscall相关联,但在所有其他情况下它都能正常工作。

请帮助我。

1 个答案:

答案 0 :(得分:0)

我输入你的代码并在运行Fedora 20的x64上使用as和ld 32位选项进行汇编和链接,并且运行完美,在系统调用后将0x18放入%eax reg。如果你解决了这个问题,我想知道是什么导致它以及你如何解决它。

欢呼声