|
|
| Посл.отвђт | Сообщенiе |
|
|
Дата: Сен 23, 2004 18:11:43 Здравствуйте! У меня такой вопросик: Есть некая программка в машинных кодах, расположенная ниже. :0001.0100 50 push ax :0001.0101 51 push cx :0001.0102 B0B6 mov al, B6 :0001.0104 E643 out 43, al :0001.0106 B000 mov al, 00 :0001.0108 E642 out 42, al :0001.010A B00A mov al, 0A :0001.010C E642 out 42, al :0001.010E E461 in al, 61 :0001.0110 50 push ax :0001.0111 0C03 or al, 03 :0001.0113 E661 out 61, al :0001.0115 B90400 mov cx, 0004 :0001.0118 E2FE loop 0118 :0001.011A 58 pop ax :0001.011B E661 out 61, al :0001.011D 59 pop cx :0001.011E 58 pop ax :0001.011F B8004C mov ax, 4C00 :0001.0122 CD21 int 21 По адресу 0001.0118 находится код E2FE. Он соответствует команде loop 0118. Понятно, что в цикле loop 0118, 0118 получается складыванием FE c 11A, т.е. 00FE+011A. А как вычислить, что должно быть написано вместо FE в коде E2FE, чтобы выполнялась команда loop 0110, вместо loop 0118? Заранее благодарю! |
|
|
Дата: Сен 23, 2004 20:33:40 :)) ну спросил, если ты понял, что FE+11A=118 (на калькуляторе это лучше посчитать, всключив Byte размер и сложив FE и 1A, т.е. берем только байт от слова 011A, чтобы знаковое сложение было), то в чем сложность обратного расчета? если нужно на 110, а не на 118, то что нужно прибавить к 11A чтобы получить 110? : 10-1A=F6 (адрес_куда_нужно_прыгнуть-адрес_следующей_за_loop_команды) т.е. получается E2F6. проверка: 11A+F6=110... |
|
|
Дата: Сен 23, 2004 20:34:21 (необходимый_адрес)-(адрес_след_инстр_после_loop)=(то_что_надо) 110-11A=F6 |
|
|
Дата: Сен 24, 2004 12:20:26 А я ленивый, но умный. 110=118-8 Значит FE меняем на FE-8=F6 |
|
|
Дата: Сен 24, 2004 12:45:49 >А я ленивый, но умный. 110=118-8 >Значит FE меняем на FE-8=F6 ШЕДЕВР! На доску почета! :)))))))) |
|
|
Дата: Сен 25, 2004 19:14:22 Всем большое спасибо! |
|
Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.053 |