Мне нужна помощь здесь, я новичок в хорошем языке. То, что я сделал до сих пор. Код ассемблера:
extern puts
section .data
test: db 'test',0
section .text
global main
main:
push ebp
mov ebp, esp
mov ecx, [ebp+12]
push ecx
call puts
pop ecx
mov eax,0
leave
ret 0x80
SO: Ubuntu 14.04.1 LTS
, gcc версия 4.8.2
nasm -f elf32 2lab.asm
: nasm -f elf32 2lab.asm
и скомпилируйте с gcc gcc -lc -m32 2lab.o -o 2lab
objdump -dS -M intel-mnemonic 2lab
объекта раздела main objdump -dS -M intel-mnemonic 2lab
080484a0 <main>:
80484a0: 55 push ebp
80484a1: 89 e5 mov ebp,esp
80484a3: 8b 4d 08 mov ecx,DWORD PTR [ebp+0xc]
80484a6: 51 push ecx
80484a7: e8 44 fe ff ff call 80482f0 <puts@plt>
80484ac: 59 pop ecx
80484ad: b8 00 00 00 00 mov eax,0x0
80484b2: c9 leave
80484b3: c2 80 00 ret 0x80
Запустите его ./2lab firstArg
, выход -
и если я заменил mov ecx, [ebp+12]
с mov ecx, [ebp+8]
результатом будет Segmentation fault (core dumped)
Где я ошибаюсь? Буду признателен, если вы ответите подробно. Как здесь и здесь, я не знаю, что я пропустил. Благодарю!
Помните, что прототип main
- int main(int argc, char** argv)
. Обратите внимание, что тип argv
- char**
. Вы хотите puts(argv[1])
но вы эффективно делаете puts(argv)
. Зная, что argv[1]
по определению означает *(argv + 1)
и что C-указательная арифметика масштабируется по размеру элемента, вам нужно заменить push ecx
на push dword [ecx + 4]
.
PS: ret 0x80
неверен, вы, вероятно, смешали ret
и int 0x80
вместе. Вы просто хотите ret
сюда.
get argument from stack
, а также вызов firstArg
что ему нужен этот аргумент.
Строковый аргумент puts() скорее всего неверен. Проверьте его API и убедитесь, что вы загружаете правильные аргументы. Строковые функции, такие как puts(), читают их ввод, пока не достигнут нулевого терминатора. Если они не найдут один и не будут считывать память за пределы, вы будете испытывать ошибку.