2016-10-14 5 views
-1

Я хочу напечатать AAAA со следующим:сборка системного вызова неэффективная

BITS 32; 

;write; 
push 0x41414141; 
pop ecx  ; 
mov eax, 4  ; write is syscall 4 for Ubuntu 32-bit 
mov ebx, 1  ; stdout 
mov edx, 4  ; 
int 0x80  ; 

;exit; 
mov eax, 1  ; 
mov ebx, 0  ; 
int 0x80  ; 

Тем не менее, после сборки и связан этот код только выходит, никаких ошибок, что не так?

+0

Какую документацию вы использовали для вызова 'int 80h'? Что говорит об аргументе 'ecx'? (btw, в сборке «;» означает «комментарий» .. почему вы помещаете пустой комментарий в каждую строку? .. вам не обязательно) – Ped7g

+0

ecx должен содержать указатель на строку. 0x80 означает один бит выше предела ascii, таким образом, в ОС. – Yvain

+1

Значение 0x80 равно 128, что ** является ** выше классического 7-битного ASCII, как вы заявили. Но это не имеет никакого значения для инструкции 'int', которая может вызывать процедуру прерывания для любого 8-битного числа от 0 до 255 (с' int 3', имеющим также специальный выделенный однобайтовый код операции, используемый отладчиками для точки прерывания) , не заботясь об этом отношении с ASCII. Для него стоит таблица векторов прерываний, где адрес элемента [0x80] должен указывать на некоторый допустимый обработчик (в этом случае Linux OS я полагаю). Если Linux будет использовать обработчик 0x41, вы будете делать 'int 'A'' вместо ...: D – Ped7g

ответ

3

Быстрое исправление вашего кода:

push 0x41414141 ; put 'AAAA' into stack memory 
mov ecx,esp  ; pointer to the 'AAAA' 
mov eax, 4  ; write is syscall 4 for 32-bit Linux 
mov ebx, 1  ; stdout 
mov edx, 4 
int 0x80 
add esp,4  ; restore stack 

Нет объяснения, как вы должны сначала проверить, что я не спросил в комментариях, то исправление будет либо очевидно, либо вам придется просить о чем-то конкретном вы не понимаете ...

Если вы запустили свой исходный код с strace ./my_program, вы увидите write() return -EFAULT, потому что вы передали плохой адрес. Всегда используйте strace для отладки программ, которые делают системные вызовы и не ведут себя так, как вы ожидали.

+0

Спасибо, я забыл разницу между указателем и тем, что он дает, это делает его очевидным. – Yvain

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