Примерчик (МАСМ32)

Ответить

Код подтверждения
Введите код в точности так, как вы его видите. Регистр символов не имеет значения.

BBCode ВКЛЮЧЁН
[img] ВКЛЮЧЁН
[url] ВКЛЮЧЁН
Смайлики ОТКЛЮЧЕНЫ

Обзор темы
   

Развернуть Обзор темы: Примерчик (МАСМ32)

Re: Примерчик (МАСМ32)

lemon4ik » 23 мар 2013, 20:26

.486
.model flat, stdcall
option casemap:none
includelib \masm32\lib\kernel32.lib
includelib \masm32\lib\user32.lib
include \masm32\include\kernel32.inc
include \masm32\include\user32.inc
include \masm32\include\windows.inc
.data ;(25/e - d + 2)/(b + a*a - 1)
a dd 1
b dd 2
e dd 5
d dd 3
k dd 25
ts dd 0
.code
start:

XOR edx, edx

MOV eax, [a]
IMUL eax

ADD eax,
SUB eax, 1

MOV ecx, eax

XOR edx, edx

MOV eax, [k]
MOV ebx, [e]
IDIV ebx

SUB eax, [d]
ADD eax, 2

XOR edx, edx

IDIV ecx

LEA ecx, [ts]
MOV [ecx], eax

exit:
int 21h
end start

Примерчик (МАСМ32)

lemon4ik » 23 мар 2013, 17:46

Использую МАСМ32 и OllyDebuger (второй для просмотра регистров). Есть пример (25/e - d + 2)/(b + a*a - 1) . Проверял работу кода в OllyDebuger-е: знаменатель сформировани нормально, числитель вычислен тоже, но результат деления не понятно куда пишет... Подскажите, в чем может быть проблема?

Код: Выделить всё

.486
.model flat, stdcall
option casemap:none
includelib \masm32\lib\kernel32.lib
includelib \masm32\lib\user32.lib
include \masm32\include\kernel32.inc
include \masm32\include\user32.inc
include \masm32\include\windows.inc
.data   ;(25/e - d + 2)/(b + a*a - 1)       (5 - 3 + 2)/(2 + 1 - 1) = 2
a dw 1
b dw 2
e dw 5
d dw 3
k dw 25
ts dw 0
.code
start:

xor ax,ax                ;ax=0
xor esi,esi               ;esi=0
xor ebx,ebx             ;ebx=0
xor ecx,ecx             ;ecx=0
xor edx,edx             ;edx=0

mov ax, a               ;ax=1
imul ax                   ;ax=1
mov bx,b                ;bx=2
add bx,ax               ;bx=3
sub bx,1                ;bx=2
mov si,bx               ;si=bx=2
movsx esi,si	     ;esi=si=2

xor bx,bx                ;bx=0
xor eax,eax             ;eax=0
xor edx,edx             ;edx=0

mov ax,k                ;ax=25
mov bx,e                ;bx=5
idiv bx                    ;ax=5
mov cx,d                ;cx=3
sub ax,cx                ;ax=2
add ax,2                 ;ax=4		;all is ok untill here
cwd
cdq
mov eax, dword ptr ts
mov edx, dword ptr ts+4
idiv si

exit:
int 21h
end start

Вернуться к началу