Кога кодът под СЕГМЕНТ НА ​​ДАННИ ще се изпълни в този код?

Аз съм начинаещ в асемблерното програмиране... Сърфирах много в гугъл. Има много информация, но все още не разбирам следния код. Ще съм благодарен ако някой може да обясни

MOV AX, DATA

Също така не разбирам кога кодът, който присъства в сегмента с данни, ще бъде изпълнен в тази програма.

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. Вярвам, че това е така, защото @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
Филипс: Тогава мога ли да дам като 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
Филипс: Господине, ако направя 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