Передать аргумент через командную строку - 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 "

Объяснение кода листинга программы

Объяснение кода:

  1. Переменная ebp используется как указатель на стек, который содержит стек регистров.
  2. Переменная eax используется для хранения аргументов, переданных в функцию.
  3. Переменная ecx используется в качестве счётчика для цикла.
  4. Переменная edx используется для хранения значения, которое будет выведено на консоль.
  5. Переменная ebx используется для хранения адреса строки, которую необходимо вывести на консоль.
  6. Команда xor edx,edx инициализирует переменную edx нулевым значением.
  7. Команда mov edx,DWORD [ebx] загружает значение из памяти по адресу, указанному в ebx, и сохраняет его в edx.
  8. Команда push DWORD [ebx] добавляет значение из edx в стек.
  9. Команда mov ebx,offset msg загружает адрес строки msg в ebx.
  10. Команда push ebx добавляет ebx в стек.
  11. Команда call printf вызывает функцию printf с аргументами из стека.
  12. Команда add esp,8 удаляет верхний элемент стека (результат вызова функции printf) и корректирует значение esp.
  13. Команда pop ecx удаляет верхний элемент стека (переменная ecx) и корректирует значение ecx.
  14. Команда pop eax удаляет верхний элемент стека (переменная eax) и корректирует значение eax.
  15. Команда pop ebx удаляет верхний элемент стека (переменная ebx) и корректирует значение ebx.
  16. Команда inc ecx увеличивает значение ecx на 1.
  17. Команда add ebx,4 добавляет 4 к значению ebx.
  18. Команда cmp ecx,eax сравнивает значения ecx и eax. Если ecx больше eax, то переход к команде jne looping.
  19. Если ecx не больше eax, то выполнение программы продолжается с команды mov esp,ebp.
  20. Команда pop ebp удаляет верхний элемент стека (переменная ebp) и корректирует значение ebp.
  21. Команда ret завершает выполнение функции и возвращает управление вызывающей программе. Список переменных и их значений:
  22. ebp — указатель на стек
  23. eax — хранит аргументы, переданные в функцию
  24. ecx — счётчик для цикла
  25. edx — временная переменная для хранения значения
  26. ebx — хранит адрес строки для вывода на консоль
  27. msg — строка, которую необходимо вывести на консоль (%s)

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

8   голосов , оценка 3.75 из 5
Похожие ответы