我正在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
相关联,但在所有其他情况下它都能正常工作。
请帮助我。
答案 0 :(得分:0)
我输入你的代码并在运行Fedora 20的x64上使用as和ld 32位选项进行汇编和链接,并且运行完美,在系统调用后将0x18放入%eax reg。如果你解决了这个问题,我想知道是什么导致它以及你如何解决它。
欢呼声