.686
.model flat, stdcall
option casemap :none
include \masm32\include\windows.inc
include \masm32\include\user32.inc
include \masm32\include\kernel32.inc
include \masm32\include\masm32.inc
includelib \masm32\lib\user32.lib
includelib \masm32\lib\kernel32.lib
includelib \masm32\lib\masm32.lib
.data
; Используем тип SWORD (signed word)
_a sword 70
_b sword 25
_c sword 11
_d sword 10
res sword 0
format db " Answer = %d", 0
buffer db 32 DUP(0)
title_w db "Result (SWORD)", 0
.code
start:
; Считаем знаменатель: res = (_a * _b) - _d
mov ax, _a
imul ax, _b ; ax = _a * _b
sub ax, _d ; ax = ax - _d
mov res, ax ; сохраняем знаменатель в res
; Считаем числитель: (_a * _b * _c) + _d
mov ax, _a
imul ax, _b ; ax = _a * _b
imul ax, _c ; ax = ax * _c
add ax, _d ; ax = ax + _d
; Деление: ax / res
; Перед idiv нужно подготовить dx:ax
cwd ; Расширяет знак из AX в DX:AX
idiv res ; AX = Результат, DX = Остаток
; Сохраняем результат
mov res, ax
; Вывод результата (преобразуем 16-битный SWORD в 32-битный для wsprintf)
movsx eax, res ; movsx копирует с расширением знака
invoke wsprintf, addr buffer, addr format, eax
invoke MessageBox, 0, addr buffer, addr title_w, MB_OK
invoke ExitProcess, 0
end start