Другие языки программирования и технологии
/////////////////////////маленький вопрос АССЕМБЛЕР\\\\\\\\\\\\\\\\\\\\
Мужики, тетки, дамы, господа, девочки, мальчики обращаюсь я к вам. Итак, подскажите ИДЕЮ (не тупо код) как вычеслить одними MOVами остаток от деления на 16777216 = 2^24. То есть 3 части регистра. как вот достать ту 3ю часть?
Остаток от деления на 16777216 - это ровно три младших байта числа.
Например:
Если число 12345678h, то остаток от деления его на 16777216 = 345678h.
Это, как я вижу, вы уже поняли. Теперь, как получить этот остаток только одними мувами.
Допустим, у вас исходное число
X dd 12345678h
a остаток нужно записать в переменную Y:
Y dd ?
Чтобы получить остаток, нужно представить, как числа хранятся в памяти и в регистрах.
Переменная Х по байтам с адресами будет храниться в памяти так:
00000000: 78h
00000001: 56h
00000002: 34h
00000003: 12h
Сначала нужно считать младшие 2 байта в регистр ax
mov ax,[ X ] (чтение по адресу 00000000)
В регистрах байты разместяться следующим образом:
ax=5678h; ah=56h; al=78h
См. выше, что младшие 2 байта числа равны 2-м младшим байтам остатка.
Нужно записать их в результирующую переменную Y (например с адреса 00000004):
mov [ Y ],ax (запись по адресу 00000004).
00000004: 78h
00000005: 56h
00000006: ?
00000007: ?
Теперь нужно получить старшие байты остатка. Загружаем их в ах:
mov ax,[ X + 2 ] (чтение из адреса 00000002, см. расположение байт в памяти выше)
В регистрах байты разместяться следующим образом:
ax=1234h; ah=12h; al=34h
Содержимое ah (12h) не нужно. Самый старший байт остатка должен быть = 0. Обнуляем его:
mov ah,0
Теперь записываем старшую половину остатка в переменную Y:
mov [ Y + 2 ],ax (запись по адресу 00000006).
Результат в памяти:
00000004: 78h
00000005: 56h
00000006: 34h
00000007: 00h
Весь процесс целиком:
mov ax,[ X ]
mov [ Y ],ax
mov ax,[ X + 2 ]
mov ah,0
mov [ Y + 2 ],ax
Проблема заключается в том, что нельзя прямо адресоваться к старшим 16 разрядам 32-разрядного регистра.
Если вы поймёте размещение байтов и пути их перемешений по регистрам, то вы без проблем поймёте другие варианты решения:
2)mov eax,[ X ]
mov [ Y ],eax
mov al,0
mov [ Y + 3 ],al
3)mov ax,[ X ]
mov [ Y ],ax
mov al,[ X + 2 ]
mov [ Y + 2 ],al
mov al,0
mov [ Y + 3 ],al
Например:
Если число 12345678h, то остаток от деления его на 16777216 = 345678h.
Это, как я вижу, вы уже поняли. Теперь, как получить этот остаток только одними мувами.
Допустим, у вас исходное число
X dd 12345678h
a остаток нужно записать в переменную Y:
Y dd ?
Чтобы получить остаток, нужно представить, как числа хранятся в памяти и в регистрах.
Переменная Х по байтам с адресами будет храниться в памяти так:
00000000: 78h
00000001: 56h
00000002: 34h
00000003: 12h
Сначала нужно считать младшие 2 байта в регистр ax
mov ax,[ X ] (чтение по адресу 00000000)
В регистрах байты разместяться следующим образом:
ax=5678h; ah=56h; al=78h
См. выше, что младшие 2 байта числа равны 2-м младшим байтам остатка.
Нужно записать их в результирующую переменную Y (например с адреса 00000004):
mov [ Y ],ax (запись по адресу 00000004).
00000004: 78h
00000005: 56h
00000006: ?
00000007: ?
Теперь нужно получить старшие байты остатка. Загружаем их в ах:
mov ax,[ X + 2 ] (чтение из адреса 00000002, см. расположение байт в памяти выше)
В регистрах байты разместяться следующим образом:
ax=1234h; ah=12h; al=34h
Содержимое ah (12h) не нужно. Самый старший байт остатка должен быть = 0. Обнуляем его:
mov ah,0
Теперь записываем старшую половину остатка в переменную Y:
mov [ Y + 2 ],ax (запись по адресу 00000006).
Результат в памяти:
00000004: 78h
00000005: 56h
00000006: 34h
00000007: 00h
Весь процесс целиком:
mov ax,[ X ]
mov [ Y ],ax
mov ax,[ X + 2 ]
mov ah,0
mov [ Y + 2 ],ax
Проблема заключается в том, что нельзя прямо адресоваться к старшим 16 разрядам 32-разрядного регистра.
Если вы поймёте размещение байтов и пути их перемешений по регистрам, то вы без проблем поймёте другие варианты решения:
2)mov eax,[ X ]
mov [ Y ],eax
mov al,0
mov [ Y + 3 ],al
3)mov ax,[ X ]
mov [ Y ],ax
mov al,[ X + 2 ]
mov [ Y + 2 ],al
mov al,0
mov [ Y + 3 ],al
Похожие вопросы
- Вопрос ассемблер
- написал программу на с++ работает, но есть маленький вопрос
- потратьте 1 минуту жизни! не скупитесь! ответь на мой маленький вопрос!
- //////////////////Маленький вопрос по АСЕМБЛЕРУ\\\\\\\\\\\\\\\\\
- ///маленький вопрос АССЕМБЕРУ\\\
- очень срочно....маленький вопрос по паскалю
- Вопрос по изучению языка Ассемблера под MS DOS. (Нужны советы по программному обеспечению/программированию)
- Что может ассемблер?
- Ассемблер. Определить наименьшее число из из чисел меньши 2Eh
- Почему многие программисты ненавидят ассемблер?Ведь у него куча плюсов!Он позволяет максимально задействовать