Я пишу простую программу в asembler в Linux x86_64 (синтаксис GAS). Я должен прочитать номер, закодированный в двоичной системе и сохраненный в текстовом файле. Итак, у меня есть текстовый файл «data.txt» (он находится в той же директории, что и мой исходный файл) и ниже является наиболее важным фрагмент моего кода:Asembler/GAS/Linux x86_64 - ошибка при чтении файла
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 содержит код ошибки вместо количества байтов, загруженных в буфер. Интересно, может ли это быть связано с вызовом syscall с 32-битными регистрами, но во всех остальных случаях он работает правильно.
Пожалуйста, помогите мне.