Передать аргумент через командную строку - Assembler
Формулировка задачи:
Cледующая программа попросту выписывает Hello, world на экран. Компилирую следующую программу как указано в комментарии в строке 1. Т.е. программа не использует стандартной библиотеки. Вопрос таков: каким способом возможно передать Hello, world в коммандную строку, с последующим выведением Hello, world на экран??? Any ideas???
//gcc -m32 -nostdlib a.s .intel_syntax noprefix .globl _start .text _start: mov eax,4 mov ecx,offset msg mov edx,offset length int 0x80 mov eax,1 mov ebx,0 int 0x80 .data msg: .ascii "Hello, world\n" .equ length,$-msg
Решение задачи: «Передать аргумент через командную строку»
textual
Листинг программы
.intel_syntax noprefix .text .globl main main: push ebp mov ebp,esp mov ebx,[ebp+12] mov eax,[ebp+8] mov ecx,0 looping: push ebx push eax push ecx xor edx,edx mov edx,DWORD [ebx] push DWORD [ebx] mov ebx,offset msg push ebx call printf add esp,8 pop ecx pop eax pop ebx inc ecx add ebx,4 cmp ecx,eax jne looping mov esp,ebp pop ebp ret .data msg: .ascii "%s "
Объяснение кода листинга программы
Объяснение кода:
- Переменная
ebp
используется как указатель на стек, который содержит стек регистров. - Переменная
eax
используется для хранения аргументов, переданных в функцию. - Переменная
ecx
используется в качестве счётчика для цикла. - Переменная
edx
используется для хранения значения, которое будет выведено на консоль. - Переменная
ebx
используется для хранения адреса строки, которую необходимо вывести на консоль. - Команда
xor edx,edx
инициализирует переменнуюedx
нулевым значением. - Команда
mov edx,DWORD [ebx]
загружает значение из памяти по адресу, указанному вebx
, и сохраняет его вedx
. - Команда
push DWORD [ebx]
добавляет значение изedx
в стек. - Команда
mov ebx,offset msg
загружает адрес строкиmsg
вebx
. - Команда
push ebx
добавляетebx
в стек. - Команда
call printf
вызывает функциюprintf
с аргументами из стека. - Команда
add esp,8
удаляет верхний элемент стека (результат вызова функцииprintf
) и корректирует значениеesp
. - Команда
pop ecx
удаляет верхний элемент стека (переменнаяecx
) и корректирует значениеecx
. - Команда
pop eax
удаляет верхний элемент стека (переменнаяeax
) и корректирует значениеeax
. - Команда
pop ebx
удаляет верхний элемент стека (переменнаяebx
) и корректирует значениеebx
. - Команда
inc ecx
увеличивает значениеecx
на 1. - Команда
add ebx,4
добавляет 4 к значениюebx
. - Команда
cmp ecx,eax
сравнивает значенияecx
иeax
. Еслиecx
большеeax
, то переход к командеjne looping
. - Если
ecx
не большеeax
, то выполнение программы продолжается с командыmov esp,ebp
. - Команда
pop ebp
удаляет верхний элемент стека (переменнаяebp
) и корректирует значениеebp
. - Команда
ret
завершает выполнение функции и возвращает управление вызывающей программе. Список переменных и их значений: ebp
— указатель на стекeax
— хранит аргументы, переданные в функциюecx
— счётчик для циклаedx
— временная переменная для хранения значенияebx
— хранит адрес строки для вывода на консольmsg
— строка, которую необходимо вывести на консоль (%s
)
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д