Операция LEA со сборкой 8086 - PullRequest
1 голос
/ 28 ноября 2010

Может кто-нибудь помочь мне понять следующие инструкции-

LES SI,DATA1
MOV DI,OFFSET DATA2
MOV BX,[SI]
MOV CX,[DI]
MOV[SI],CX

Ответы [ 3 ]

2 голосов
/ 28 ноября 2010

LES не LEA. LES x, y интерпретирует y как дальний указатель и загружает его данные в ES (регистр сегмента) и x.

Последовательность инструкций, как указано, странная, хотя ES на самом деле не используется.

В любом случае, последовательность инструкций (если [SI] изменено на ES:[SI]): с учетом дальнего указателя (DATA1) и переменной (DATA2) переместите содержимое, на которое указывает DATA1 в BX и замените их на то, что хранится в настоящее время в DATA2 (что также будет в CX).

1 голос
/ 28 ноября 2010

Вы можете просто посмотреть страницу инструкции по сборке, и она объяснит, что каждая из этих инструкций делает в простом для понимания виде;во многих отношениях сборка в ее простом низкоуровневом простоте легче понять в одной строке, чем в языках более высокого уровня.

Я никогда не могу вспомнить, какой синтаксис ассемблера x86 упорядочивает что-либо, если я его не использовалчерез некоторое время (два основных синтаксиса ассемблера x86 упорядочивают операнды в обратном порядке), поэтому я не буду здесь говорить точный результат.

Для первого, я предполагаю, что это опечатка, а вы имели в виду LEAвместо LES?LEA означает «эффективный адрес загрузки», если я правильно помню.Его главная цель - вычислить адрес памяти чего-либо, когда вы хотите узнать адрес, а не просто использовать адрес.

(правка) Я раньше не использовал LES, и Google хотел перенаправить меня в LEAотсюда моё вышеприведённое утверждение.Я оставлю вышеупомянутое, хотя, так что вы можете извлечь из этого пользу(/ edit)

MOV перемещает данные из одного места в другое.Операнды в инструкциях MOV, заключенные в квадратные скобки [], означают, что вместо этого вам нужен этот адрес памяти, поэтому MOV CX, [DI] будет «перемещать содержимое регистра CX в ячейку памяти по адресу, хранящемуся в DI».register "(или наоборот, [DI] в CX, см. приведенное выше утверждение о порядке операндов).

Я не уверен в" OFFSET DATA2 ", так как я не помню ключевое слово смещения.* * 1011

0 голосов
/ 28 ноября 2010

соответствует следующему коду C:

// DATA1 and DATA2 are 'far' pointers to word of 16 bits, let's say they are 'short'
short bx = *DATA1;
*DATA1 = *DATA2;
// the old value of *DATA1 is still available in the BX register.
// and the value of *DATA2 is still available in the CX register.
// also, ES is set to the segment where DATA1 and DATA2 resides.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...