vijaydidmca Ответов: 2

У меня есть некоторые проблемы с сборкой.


Я просматривал файлы исходного кода msdos и нашел там несколько удивительных инструкций на ассемблере. Они заключаются в следующем :

DEVICE_READ EQU 4
DEVICE_READ_WRITE_HEADER_LENGTH EQU 22

MOV CX, (DEVICE_READ SHL 8) ИЛИ DEVICE_READ_WRITE_HEADER_LENGTH

что это значит?

Что я уже пробовал:

Я пытался понять, но не смог понять, что эти инструкции пытаются сказать.

Richard MacCutchan

Google найдет вам множество документов на языке ассемблера, где они четко объясняются.

2 Ответов

Рейтинг:
0

Member 13718688

Инструкция просто перемещает число в CX, но ассемблер проделывает некоторую работу, чтобы создать это число.

Когда ассемблер видит (DEVICE_READ SHL 8), он сдвигает число 4 влево на 8 бит, что приводит к значению 0x400. Затем он переводит 22 в это число, и поскольку 22 десятичных знака равно 16 шестнадцатеричным, результирующее значение равно 0x416.

После того как ассемблер выполнит эту работу, инструкция это просто так:

MOV CX,  0X416


Рейтинг:
0

Jochen Arndt

То EQU директива дает символическое имя числовой константе. Это похоже на C/C++ define но более строгий.

Инструкции справа-это не директивы языка ассемблера, а директивы ассемблера (интерпретатора). Они обрабатываются во время компиляции и приводят к одному постоянному числовому значению.

То MOV инструкция присваивает значение правой стороны регистру или ячейке памяти на левой стороне. Для вашего примера это регистр CX.

Эквивалентный код с использованием синтаксиса Visual C/C++ для x86:

#define DEVICE_READ 4
#define DEVICE_READ_WRITE_HEADER_LENGTH 22
__asm {
    MOV CX, (DEVICE_READ << 8) | DEVICE_READ_WRITE_HEADER_LENGTH
}