· Начало · Отвђтить · Статистика · Поиск · FAQ · Правила · Установки · Язык · Выход · WASM.RU · Noir.Ru ·

 WASM Phorum —› WASM.ASSEMBLER —› Странный результат при косвенной адресации

Посл.отвђт Сообщен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