movzx ассемблер



Автор Simak задал вопрос в разделе Другие языки и технологии

Assembler и получил лучший ответ

Ответ от Миоко Таканава[гуру]
Вопрос 1
Вот макрос, генерирующий случайные числа от 0 до n-1. Алгоритм взят из модуля System Delphi. Входной параметр n, результат возвращается в регистре eax. Для собственных нужд используйте соответствующую его часть (eax, ax, al):
mGenRandom macro n
push edx
push ebx
mov eax,Seed
mov edx,08088405h
mul edx
inc eax
mov Seed,eax
mov ebx,n
mul ebx
mov eax,edx
pop ebx
pop edx
endm
Seed (dword) – глобальная переменная генератора ПСП. Первоначально её необходимо инициализировать, например, текущим системным временем.
Для MS-DOS используйте подпрограмму:
Randomize proc
pushad
mov ah,2Ch
int 21h
movzx eax,dl
movzx ebx,dh
imul eax,60
add eax,ebx
imul eax,60
movzx ebx,cl
add eax,ebx
imul eax,24
movzx ecx,ch
add eax,ecx
imul eax,7
mov Seed,eax
mov ah,2Ah
int 21h
movzx eax,al
add Seed,eax
popad
ret
Randomize endp
Для Windows:
Randomize proc;
pusha
sub esp,16
push esp
call GetSystemTime; вызов WinAPI функции
movzx eax,word ptr [esp+4];wDayOfWeek
imul eax,24
add ax,[esp+8];wHour
imul eax,60
add ax,[esp+10];wMinute
imul eax,60
movzx edx,word ptr [esp+12];wSecond
add eax,edx
imul eax,1000
mov dx,[esp+14];wMilliseconds
add eax,edx
mov Seed,eax
add esp,16
popa
ret
Randomize endp
Вопрос 2
Локальные переменные в теле макроса задаются с помощью директивы local, так же, как и в подпрограммах.
Вопрос 3
Символ % предписывает транслятору вычислить значение фактического параметра и подставить в листинг программы текстовое представление результата.
Например, для макроса
print macro c
mov dl,c
mov ah,2
int 21h
endm
Обращение к макросу командой
print 20h + 4
сформирует код первой команды макроса как mov dl,20h + 4
А print % 20h + 4 сформирует команду mov dl,36, где 36 – это результат вычисления 20h+4 в десятичном виде.
P.S. Приведённые примеры фрагментов рассчитаны на процессор i80386 или более современные.
P.P.S. Несмотря на то, что программы для MS-DOS 16-разрядные, 32-разрядные регистры полностью доступны даже в реальном режиме работы процессора.
P.P.P.S. Юрий-17 перепутал ассемблер и С.
Источник: Юров В. И. Assembler. 2-e изд. стр: 297 - 305.Юрий-17
(72165)
Да с макросом, действительно перепутал - не прочитал внимательно! 🙂

Ответ от Ўрий-17[гуру]
генератор ПСП работает по формуле X'=A*X+C! Все переменные 32-битные целые. Обычно для генератора, который используется в приложениях, их результата X' используют с 30 по 16 бит (диапазон 32768 чисел) , а уж затем используют оператор %, реализующий деление по модулю (или взятие остатка от целочисленного деления) то есть если выполнить операцию %n, то генерировать будут числа в диапазоне от 0 до n-1

Ответ от 3 ответа[гуру]
Привет! Вот подборка тем с похожими вопросами и ответами на Ваш вопрос: Assembler
 

Ответить на вопрос:

Имя*

E-mail:*

Текст ответа:*
Проверочный код(введите 22):*