|
|
| Посл.отвђт | Сообщенiе |
|
|
Дата: Май 20, 2004 09:44:41 Добрый день. На днях учился обращаться с косвенной адресацией на асме. Код был следующим: 00401000 mov eax, 0000000d 00401005 mov edx, 00000002 0040100A mov ebx, 00000000 0040100F add al, dl 00401011 mov eax, 0040100F 00401016 add ebx, dword ptr [eax] После выполнения последней инструкции ebx принимало значение 000000bb в отладчике. Априори я считал что значение должно получится 00401011 поскольку eax присвоено значение 0040100f. При косвенной адресации это значение рассматривается как адрес. Но по этому адресу значение получается путем прибавления в том же регистре dl к al, т.е. по сути 0040100f+dl (в арифметическом смысле). Значение ebx 000000bb которое видно в отладчике это перевернутое шестнадцатеричное представление команды 0040100F add al, dl В hex-редакторе эта команда выглядит как bb000000 По какому правилу это получается? В доступной мне литературе ничего не нашел. Буду признателен, если кто-нибудь мне объяснит эту фишку или хотя бы даст ссылку на соответствующую литературу по косвенной адресации. Спасибо. |
|
|
Дата: Май 20, 2004 10:22:36 Правка Мож я туплю, но… reflector После выполнения последней инструкции ebx принимало значение 000000bb в отладчике У меня в отладчике получилось 0FB8D000h. Так как инструкция add al,dl ассемблируется в 00D0h, это первые 2 байта, далее берутся вторые 2 байта из mov eax, 0040100Fh — это 0B80F. Вот. |
|
|
Дата: Май 20, 2004 10:26:04 Правка reflector Априори я считал что значение должно получится 00401011 Это почему? 00401011 — это адрес, чтобы его получить в ebx, как ты хотел, надо написать 0040100F add al, dl 00401011 mov eax, 0040100F 00401016 add ebx, eax |
|
|
Дата: Май 20, 2004 10:54:27 Да, виноват. Команда 00401011 mov eax, 0040100F дает результат 0FB8D000h А вот команда 00401011 mov eax, 0040100А дает результат 000000bb. Тем не менее я по-прежнему не понимаю, по каким правилам это получалось. Почему берутся первый два байта одной инструкции, и два байта другой? Где про это можно прочитать? Кроме того код 0040100F add al, dl 00401011 mov eax, 0040100F 00401016 add ebx, eax дает результат в еbx 0040100F, а мне надо 00401011 В любом случае спасибо за отклик :) |
|
|
Дата: Май 20, 2004 11:23:22 reflector Почему берутся первый два байта одной инструкции, и два байта другой? Байты берутся, начиная с заданного адреса, а не с той или иной инструкции. Если команда сложения выглядит add ebx, eax, то при чем тут косвенная адресация? |
|
|
Дата: Май 20, 2004 12:06:45 Правка reflector дает результат в еbx 0040100F, а мне надо 00401011 Ничего не понял ни я, ни ты! Что значит, тебе надо? Вообще, чего именно ты добиваешься? label1: add al, dl label2: mov eax,offset label1 ; в отладчике и увидишь своё 40100Fh add ebx,eax ; ebx = адрес инструкции add al,dl label1: add al, dl label2: mov eax,offset label2 ; в отладчике увидишь 401011h add ebx,eax ; ebx = адрес инструкции mov eax… |
|
|
Дата: Май 20, 2004 12:34:32 Я пытаюсь понять почему в ebx команда 00401011 mov eax, 0040100F дает результат 0FB8D000h я рассчитывал, что: 00401016 add ebx, dword ptr [eax] 1. при косвенной адресации берется адрес из eax 0040100F 2. по этому адресу берется значение - результат выполнения команды 0040100F add al, dl 3. это значение присваивается ebx В итоге получается: 1. берется адрес 0040100F 2. значением по этому адресу является не результат команды add al, dl Значение это: 2 байта из опкода этой команды, т.е. 00D0h в младшую часть eax 2 байта из опкода команды 0B80F, т.е. 0B80F в старшую часть eax Итого по этому адресу в оперативной памяти хранится опкод команды, а не результат от ее выполнения. Я правильно понял? |
|
|
Дата: Май 20, 2004 14:31:21 Правка reflector Почитай внимательно документацию по ассемблеру, книжку какую, что ли?! при косвенной адресации берется адрес не адрес! берутся данные, что лежат по адресу, который находится у тебя в eax! по этому адресу берется значение - результат выполнения команды Гм… Результат выполнения команды будет лежать там, где ему и положено: в al. Итого… Я правильно понял? Да! |
|
|
Дата: Май 20, 2004 14:42:42 Спасибо за отклики! Книжку я прочитал. Осталось ее правильно понять :)) |
|
Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.076 |