|
Ассемблер в примерах - Длинный (межсегментного) перехода регистра CS
- Вопрос:
-
1. Помогите с написанием длинного (межсегментного) перехода регистра CS. Меня интересуют способы, приёмы изменения этого сегмента. Если написать:
mov ax,0BF00h
mov es,ax
то сегментный регистр es будет равен 0BF00h. Этим же приёмом можно изменить и другие сегментные регистры: ds и ss, но только не cs! Отладчик напишет: Invalid opcode. Странно, про другие регистры не пишет, а про cs пишет. Неужели всё дело в том, что cs вместе с ip указывает на адрес текущей команды.
2. Я знаю только один способ изменения cs, вот такой:
jmp dword ptr cs:[x]
int 20h
x dd '1234'
Но опять непонятно, почему CS меняется на 3132, ведь я прописал сегмент 12, а смещение 34. В отладчике эта команда пишется: jmp FAR cs:[107], а по адресу 107 - 10А находятся числа 34 33 32 31. Откуда тройки-то взялись?
- Ответ:
-
1)Да это особенный регистр вместе IP он указывает на адрес следующей исполняемой команды.
Вы не втретите команд типа MOV CS,RR или POP CS , хотя PUSH CS есть. Также как IP его можно изменить только косвенно, командами переходов, вызовами подпрограмм и возвратами из них.
2)Все правильно Вы записываете строку символов, а это не числа. Если посмтрите на кодовую таблицу символов,то увидете, что "0"=30h, "1"=31h, "2"=32h и т.д.
| |