2016-02-03 3 views
1

Я пытаюсь реализовать в GAS простую тестовую программу, которая открывает файл, записывает ему текст и выходы. Однако системный вызов «open» продолжает возвращать «-14» («EFAULT - плохой адрес», если я правильно понимаю). Программный код выглядит следующим образом:Не удается открыть файл в Linux через 0x80

.intel_syntax noprefix 
.section .data 

textoutput: 
    .asciz "Hello world!" 
pstr_end: 
    .set lentext, pstr_end - textoutput 
filetoopen: 
    .asciz "/tmp/tsttxt" 

.section .text 
.globl main 

.func main 
main: 

mov eax, 5   # open 
mov ebx, filetoopen # filname 
mov ecx, 2   # flags: read and write 
mov edx, 0700 # mode 
int 0x80 

mov ebx, eax  # <<< !!! eax here contains -14 
mov eax, 4 
mov ecx, textoutput 
mov edx, lentext 
int 0x80 

mov eax, 1 
mov ebx, 0 
int 0x80 

проблема, кажется, с filetoopen строки (страница руководства к open говорит, что EFAULT означает pathname points outside your accessible address space.) Является ли filetoopen правильно объявленный в коде программы? Что может быть причиной этой ошибки?

Спасибо.

+0

Я бы рассмотрел использование YASM или NASM, если вы собираетесь использовать синтаксис Intel для чистого программирования сборки. Их синтаксис Intel «лучше». –

+0

@ Jonathon Мне нравится, что с GAS можно использовать Eclipse для работы с ассемблером (подсветка синтаксиса, отладка и т. Д.) –

ответ

3

В синтаксисе intel вам необходимо использовать mov ebx, offset filetoopen. Если вы посмотрите на фактической инструкции, как смонтированном вы можете видеть, что это нагрузка на память:

80483e1:  8b 1d 2d 96 04 08  mov ebx,DWORD PTR ds:0x804962d 

Это, конечно, не так, вам нужен адрес. Это относится и к двум другим случаям этого шаблона.

+0

Спасибо. «lea», похоже, является правильной инструкцией в этом случае. –

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