Когда будет выполняться код в разделе DATA SEGMENT в этом коде?

Я новичок в программировании на ассемблере... Много рылся в гугле. Информации много, но я так и не понял следующий код. Буду признателен, если кто-нибудь объяснит

MOV AX, ДАННЫЕ

Я также не понимаю, когда код, который присутствует в сегменте данных, будет выполняться в этой программе.

ASSUME CS:CODE,DS:DATA

CODE SEGMENT
 MOV AX,@DATA
 mov DS,AX
 ...
 ...
CODE ENDS


DATA SEGMENT
   ...
   ...
   ... //SOMECODE
DATA ENDS 

Кроме того, может ли кто-нибудь объяснить мне, что делают следующие инструкции?..

MOV AH , ??H ( ?? can be filled with 09,4c etc).

MOV DS,AX

MOV ES,AX


person Muthu Ganapathy Nathan    schedule 16.03.2011    source источник


Ответы (2)


Предупреждение: я никогда в жизни не писал ассемблер для 8086, но вот что я из него делаю.

MOV AX,@DATA — это первая строка кода, которая запускается. Я считаю, что @DATA — это переменная, которая содержит значение местоположения в памяти, где находится сегмент данных. Он перемещает ячейку памяти @DATA в регистр AX (16-битный регистр). Здесь следует отметить одну вещь: @ перед словом ДАННЫЕ. Я считаю, что это связано с тем, что @DATA оценивается в процессе связывания и будет заменено его фактическим значением. Обратите внимание, что в других примерах нет символа @ впереди, потому что они изначально ссылаются на фактическую ячейку памяти.

Затем MOV DS,AX установит это место в памяти как переменную DS, которая является стандартной переменной (или регистром в данном случае) для сборки 8086. Он всегда должен указывать на расположение вашего хранилища, где вы хотите хранить значения (куча, если вы знакомы с терминологией C++).

Регистр AX — это просто временный заполнитель, который вы можете загружать значениями и выполнять команды выполнения.

MOVE AH, ??H Во-первых, AH относится к старшей стороне регистра AX. Братом этого будет AL, который относится к «младшей» стороне регистра AX. Это используется, когда вы хотите выполнять команды с 8 битами вместо 16 бит. Вторая часть этого, ??H, как вы его называете, - это значение, которое вы хотите сохранить в регистре AH. H в конце означает «шестнадцатеричный». Итак, если у вас есть 00H, это будет означать ноль (в шестнадцатеричном формате). Если вы введете FFH, это будет то же самое, что 255 в десятичной системе счисления.

Вернемся к вашему первоначальному вопросу «Когда будет выполняться код в сегменте данных в этом коде?» -- Я полагаю, вы спрашиваете, когда будет выполнен СЕГМЕНТ ДАННЫХ. Обычно это не должно выполняться, потому что предполагается хранить данные (переменные) для использования в вашем СЕГМЕНТЕ КОДА. Я считаю, что в некоторых операционных системах вы можете обойти это и просто ПЕРЕЙТИ или ВЕТВИТЬСЯ к этому разделу кода и рассматривать его как обычный СЕГМЕНТ КОДА. Иногда именно так работают переполнения стека, переполнения кучи (взломы) и т. д.

person Joe Phillips    schedule 16.03.2011
comment
Phillips:Тогда я могу передать как MOV DS@DATA? Это законно? И MOV AX,[5000h] не работает в моем ассемблере Пожалуйста, скажите и об этом... - person Muthu Ganapathy Nathan; 17.03.2011
comment
Я считаю, что MOV DS,@DATA будет законным, но я не уверен. Я думаю, это зависит от ассемблера, который вы используете. Я полагаю, что вы используете синтаксис Intel, с которым я, к сожалению, не знаком. Я не вижу ничего плохого в MOV AX,[5000h], но вместо этого вы можете попробовать MOV AX,5000h. - person Joe Phillips; 17.03.2011
comment
Phillips: Сэр, если я сделаю MOV AX, [5000h] значение в [5000] будет скопировано. Но если я сделаю MOV AX,5000h, 5000 будут скопированы. Здесь много различий. Я прав, сэр..? - person Muthu Ganapathy Nathan; 17.03.2011
comment
Да вы правы. Я полагаю, что вас интересует то, что называется режимами адресации. Есть разные виды. Опять же, я родом из Motorola, поэтому я очень мало знаю о том, как работают режимы адресации Intel. В гугле полно информации :) - person Joe Phillips; 17.03.2011
comment
@data заставит компоновщик создать запись о перемещении в заголовке DOS EXE. @data — это значение сегмента раздела data. Компоновщик выдаст значение сегмента относительно его положения в исполняемом файле в качестве заполнителя, но оно будет изменено (через таблицу перемещений в заголовке EXE) загрузчиком DOS путем добавления сегмента, в который был физически загружен исполняемый файл DOS. память со значением сегмента, сгенерированным компоновщиком. Фактически @data полностью известен только во время выполнения. - person Michael Petch; 19.08.2016

Mov ax,@data — это способ загрузки начального адреса сегмента данных в ax. затем с помощью сегмента данных mov ds,ax инициализируется. эта инструкция используется в tasm ассемблере.

person Nikhil Kulkarni    schedule 02.05.2012