Вывод в MessageBox, присвоить значение переменной - Assembler

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

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

format PE GUI 4.0
include 'fasm/include/win32a.inc'
entry start
section '.data' data readable writeable
somevar db ?
message db 'dasdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaasa',0 
 
section '.code' code readable executable
start:
        mov eax, 123
        mov ebx, 90
        add eax, ebx
 
        invoke MessageBox,0,eax,0,0
        invoke ExitProcess
Я помещаю числа в регистры eax, ebx, потом складываю с результатом в eax, почему не получается вывести число в MessageBox? Хотя если я помещу в eax строку message все работает. Кроме того, не совсем понятно, eax это регистр процессора, у него ограниченный размер в битах, почему проходит сохранение длинной строки в регистре или в регистре сохраняется только ссылка(адрес) строки в оперативной памяти? И если зделать так:
mov eax, 5
в eax тоже будет храниться ссылка или уже значение? Кроме того:
somevar db ?
- как я понимаю это переменная с не присвоенным значением, как в коде присвоить ей значение, никакой из вариантов не работает:
mov somevar, eax
mov somevar, 5
mov somevar, message

Решение задачи: «Вывод в MessageBox, присвоить значение переменной»

textual
Листинг программы
.386
.model flat, stdcall
        include \masm32\include\msvcrt.inc  
        includelib \masm32\lib\msvcrt.lib 
 
.data
       sss db "Hello World"
 
.code
start:
        invoke crt_printf, ADDR sss
        ret
END start

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

  1. Объявлены сегменты и модель памяти — .386 и .model flat, stdcall соответственно.
  2. Включена библиотека msvcrt.inc и указывается путь до библиотеки msvcrt.lib.
  3. Создана переменная типа данных db — sss, которая содержит строку Hello World.
  4. Выполняется функция invoke, которая вызывает функцию crt_printf с аргументом ADDR sss.
  5. Возвращается управление в вызывающую программу.

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

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