2014-04-03 2 views
1

Я пишу простую программу в 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-битными регистрами, но во всех остальных случаях он работает правильно.

Пожалуйста, помогите мне.

ответ

0

Я ввел свой код и скомпилировал его на моем x64-сервере Fedora 20 с использованием 32-битных опций as и ld для сборки и соединения, и он отлично работал, помещая 0x18 в регистр% eax после syscall. Если вы решили проблему, я хотел бы знать, что вызвало ее и как вы ее исправили.

ура

 Смежные вопросы

  • Нет связанных вопросов^_^