Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 23.03.2013, 17:45   #1
lemon4ik
Новичок
Джуниор
 
Регистрация: 23.03.2013
Сообщений: 5
Вопрос Примерчик (МАСМ32)

Использую МАСМ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
lemon4ik вне форума Ответить с цитированием
Старый 23.03.2013, 18:31   #2
f.hump
C/C++, Asm
Участник клуба
 
Аватар для f.hump
 
Регистрация: 02.03.2010
Сообщений: 1,323
По умолчанию

Код:
start:

XOR edx, edx

MOV eax, [a]
IMUL eax

ADD eax, [b]
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
f.hump вне форума Ответить с цитированием
Старый 23.03.2013, 18:38   #3
lemon4ik
Новичок
Джуниор
 
Регистрация: 23.03.2013
Сообщений: 5
По умолчанию

Благодарю за код. А можно узнать, что означают [] эти скобки, и почему переменные находятся в них?
lemon4ik вне форума Ответить с цитированием
Старый 23.03.2013, 18:45   #4
f.hump
C/C++, Asm
Участник клуба
 
Аватар для f.hump
 
Регистрация: 02.03.2010
Сообщений: 1,323
По умолчанию

в принципе, метки в скобки заключать не обязательно, мне просто так легче читать.

че-то я пропустил доисторический синтаксис для инициализаторов. оригинально там размер WORD, я проапгрейдил до DWORD.
Код:
.data
a DWORD 1
b DWORD 2
e DWORD 5
d DWORD 3
k DWORD 25
ts DWORD 0

Последний раз редактировалось f.hump; 23.03.2013 в 19:04.
f.hump вне форума Ответить с цитированием
Старый 23.03.2013, 19:05   #5
lemon4ik
Новичок
Джуниор
 
Регистрация: 23.03.2013
Сообщений: 5
По умолчанию

еще вопрос: переменные a, b, e, ... ts какой размерности должны быть согласно коду?
Почему спрашиваю, просто в задании сказанно использовать переменные сначала dw размерностью, а потом dd.

Эм, не знаю с каким масмом Вы работаете, в моем: dw - word, dd - double word, dq - quarter word.
Насколько понял DWORD - double word, верно?

Если так, то какие регистры нужно будет использовать, чтобы работать с переменными типа WORD?

Последний раз редактировалось lemon4ik; 23.03.2013 в 19:17.
lemon4ik вне форума Ответить с цитированием
Старый 23.03.2013, 19:10   #6
f.hump
C/C++, Asm
Участник клуба
 
Аватар для f.hump
 
Регистрация: 02.03.2010
Сообщений: 1,323
По умолчанию

"сначала" и "потом"?

две программы?
или
вход - WORD, выход - DWORD?
f.hump вне форума Ответить с цитированием
Старый 23.03.2013, 19:18   #7
lemon4ik
Новичок
Джуниор
 
Регистрация: 23.03.2013
Сообщений: 5
По умолчанию

да, две разные программы: в одной размерность переменных WORD, во второй DWORD
lemon4ik вне форума Ответить с цитированием
Старый 23.03.2013, 19:50   #8
f.hump
C/C++, Asm
Участник клуба
 
Аватар для f.hump
 
Регистрация: 02.03.2010
Сообщений: 1,323
По умолчанию

WORD - ax, bx, cx, dx, si, di
DWORD - eax, ebx, ecx, edx, esi, edi
f.hump вне форума Ответить с цитированием
Старый 23.03.2013, 20:17   #9
lemon4ik
Новичок
Джуниор
 
Регистрация: 23.03.2013
Сообщений: 5
По умолчанию

Благодарю за помощь.
lemon4ik вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Код программы на Ассемблере (масм32) dimon305 Помощь студентам 6 18.05.2010 15:42
Примерчик на функции C++ ixnn Помощь студентам 1 02.06.2009 23:40
Примерчик!!!! пожалуйсто!!!!!! Artom Паскаль, Turbo Pascal, PascalABC.NET 2 11.05.2009 13:03
Решить примерчик nikleb Паскаль, Turbo Pascal, PascalABC.NET 2 21.04.2008 19:18