Копирование строки - Assembler

Узнай цену своей работы

Формулировка задачи:

Есть некая функция onLog(char), которая в свою очередь передает параметры другой функции. Если статично задать msg db "Hello World", 0 то строка передается полностью, а если взять строку из rcx(сюда передается строка из параметров onLog("Hello world")) то слово обрезается и получается "Hello wo" Как это можно исправить?В асм всего пару дней.. заранее спасибо за ответы
.const
Init dq 140019EA8h
Sendmsg dq 140009148h
.data?
msg db ?
.code
onLog proc
mov rax, [rcx]
mov [offset msg], rax
xor     ecx, ecx
call Init
mov     rcx, rax
lea     rdx, msg
call Sendmsg
ret
onLog endp
end

Решение задачи: «Копирование строки»

textual
Листинг программы
.const
Init dq 140019EA8h
Printf dq 140009148h
.code
onLog proc
mov rbp, [rcx]
xor     ecx, ecx
call Init
mov     rcx, rax 
mov     rdx, rbp
call Printf
ret
onLog endp 
end

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

.const - это сегмент, в котором хранятся константы. Init - это функция, которая инициализирует сегмент стека и регистры. Printf - это функция, которая выводит строку на экран. onLog - это процедура, которая вызывает функцию Init, сохраняет в стеке адрес возврата, затем вызывает функцию Printf.

  1. onLog proc - процедура, которая выполняет действия при вызове.
  2. mov rbp, [rcx] - перенос в rbp адреса из rcx.
  3. xor ecx, ecx - обнуление ecx.
  4. call Init - вызов функции Init.
  5. mov rcx, rax - перенос в rcx содержимого rax.
  6. mov rdx, rbp - перенос в rdx содержимого rbp.
  7. call Printf - вызов функции Printf.
  8. ret - завершение процедуры.
  9. onLog endp - завершение определения процедуры.
  10. end - конец программы.

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


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

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

14   голосов , оценка 4 из 5