Мліметтерді орналастыру командалары

АТ–ны командалар жйесінде біршама орналастыру командалары бар, мнда біз MOV,XCHG командаларын арастырамыз. Орналасатын шама командадан, регистрден немесе жад яшыынан алынады да регистрге немесе жад яшыына жазылады.

MOV командасы екі операндты команда, жазылуы:

Орналастыру (move): MOV op1,op2

Орындалуы: op2-дегі млімет кшіріліп op1-ге жазылады (кшіріледі) op1=op2, мнда op1-абылдаыш, op2-жібергіш. Бл команда жалаушаларды згертпейді.

MOV командасындаы операндтарды ммкін комбинациялары:

op1 op2 op1 op2
reg reg reg imm
mem reg mem imm
reg mem mem16 segreg
reg16 segreg segreg mem16
segreg reg16    

Бдан мліметтерді жадты бір яшыынан екінші яшыына, бір сегменттік регистрден екінші сегменттік регистрге кшіруге, тікелей операндты сегменттік регистрге жазуа болмайтынын креміз. Бл компьютерде мндай машиналы команданы болмауына байланысты. Алгоритм бойынша ондай амалдарды жасау ажет болан жадайда, оларды екі командада орындауа болады: жіберілетін мліметті андайда-бір жалпы регистрге кшіріп, содан со абылдаыша жіберу арылы. Мысалы:

;200 санын DS регистріне жазу

MOV AX,200

MOV DS,AX

; А яшыындаы санды В яшыына жазу

MOV AX,A

MOV B,AX

Ескерте кететін бір жайт - MOV командасымен CS регистр рамын згертуге болмайды. Себебі CS жне ІР регистрлері келесі орындалатын команданы адресін анытайды, оларды згерту программаны дрыс орындалмауына келеді.

PTR типті крсету операторы. Екі операндты лшемі бірдей болуы ажет. Егер лшемдері ртрлі болса, тип крсету директивасы олданылады:

Тип крсету: тип PTR [рнек]

Мысалы, BYTE PTR a=2

PTR директивасы екі жадайда олданылады: операндтарды типтері белгісіз болуы себепті операндтарды біріні типін айын крсету керек боланда жне операндтарды типтерін сйкестендіру шін.

5.1.1.1-мысал. Табалы сз лшемді санды Х-ке жне табасыз байт лшемді санды Z-ке меншіктеу программасын жазайы.

Мліметтерді енгізу-шыаруды Паскальда жасаймыз. Паскальдаы программа негізгі программа болады да, одан ассемблер модулі шаырылады.

Паскальда жазылан MIS5_1_1_1_PAS.pas программаны мтіні:

Program missal5_1_1;

{$L mis5_1_1_1.obj} {mis5_1_1_1.obj Ассемблер модулін осу}

{$f+}{FAR–процедуралар мен функцияларды шаыру директивасы}

Var

x,a:integer; b,у:byte;

{Ассемблерде жазылан сырты процедураны сипаттамасы}

Procedure mis5_1_1_1(var x:integer; var z:byte);{FAR;} external;

begin

Writeln('a='); Readln(a);

x:=a;

Writeln('b='); Readln(b);

z:=b;

Writeln('Pascal x=',x,'; z=',z);

z:=0;

x:=0;

mis5_1_1_1(x,z);

Writeln('Assembler: x=',x,'; z=',z);

Readln

end.

Ассемблердегі Mis5_1_1_1_ASM.asm модуліні мтіні

;mis5_1_1_1.asm

title Move for 8 or 16 bits

.MODEL Large

.data

Extrn b:byte, z:byte

.code

Public mis_1_1

mis_16 proc far

mov ax,a

mov bl,b

mov x,ax

mov z,bl

ret

mis_1_1 endp

End

Программаны нтижесін кру шін мына рекеттерді жасау керек:

4. Borland/Turbo Pascal программалау ортасын іске осып, бір терезеде Mis5_1_1_1_PAS.pas программасын, ал екінші терезеде Mis5_1_1_1_ASM.asm модулін теру керек ( модульдерді атаулары бір бірінен згеше болсын).

5. Mis5_1_1_1_.asm модулін, Shift+F3 Borland/Turbo Pascal-рамына кіретін TASM компиляторын шаырып компиляциялаймыз. Ассемблер модулін жеке компиляциялауа да болады. Егер ате болмаса ажетті объект файлы шыады. Егер ателер табылса оларды жндеп, ассемблерлеу процессі айталанады.

6. Негізгі Mis5_1_1_1_PAS.pas программасы, деттегіше, компиляцияланып іске осылады.

5.1.1.2-мысал. Енді 16 разрятты программалау шін крделірек есепті арастырайы. Х яшыындаы екіеселі сз лшемді (32 разрядты) табасыз санды Y яшыына кшіру керек.

Шешуі. Программаны командаларында Х жне (Х+2)адрестерін тікелей крсете алмаймыз. Мысалы, MOV AX,X командасын трансляциялаанда ассемблер ате табады. Себебі 16 разрятты программалауда MOV командасында BYTE, WORD типті операндтарды ана крсетуге болады. Ал бізде DWORD типті Х операндасы крсетілген. Осындай ате болмас шін ассемблер Х айнымалысын екіеселі сз емес жай сз лшемді деп абылдау керек. Ол шін PTR операторы олданылады.

;mis5_1_1_2_a.asm

.Model Large

.data

Extern x:Dword, y:Dword

;x dd 12345678h

.code

Public MovL

Mis5_1_1_2_a proc far

mov ax, WORD PTR x

mov bx, WORD PTR x+2

mov WORD PTR y,ax

mov WORD PTR y+2,bx

ret

mis5_1_1_2 endp

End

Бл мысал 32 разрятты программалауда Х-ті бірден ЕАХ регистріне жіберіп, одан Y-ке орналастыру арылы жасалады:

;mis5_1_1_2_b.asm

;

.Model Large

.data

Extern x:Dword, y:Dword

;x dd 12345678h

.code

Public MovL

Mis5_1_1_2_b proc far

mov eax, x

mov y,eax

ret

mis5_1_1_2_b endp

End

XCHG командасы.Команданы жазылуы:

Алмастыру (exchange): XCHG op1,op2

Бл команда зіні операндтарыны мндерін алмастырады(ор1óор2). Жалаушалар згермейді:

MOV АХ,10 ;АХ=10

MOV BX,100 ;BX=100

XCHG AX,BX ;AX=100,BX=1

5.1.1.3-мысал. X DD ?

Екіеселі Х сзіні сздеріні орындарын ауыстыру керек.

Шешуі.

Екіеселі Х сзіні сздері X жне X+2 яшытарынан алынады. Ал, 2-мысалда айтыландай, 16 разрятты программалауда Х жне (Х+2) адрестерін тікелей крсете алмаймыз. Сондытан, алдымен PTR операторын пайдаланып Х-ті сол жатаы сзін AX регистріне орналастырып алып оны Х+2 -тегі о жатаы сзімен алмастырымыз, сонан со AX регистріндегі сзді Х-ке орналастырамыз:

MOV AX,WORD PTR X ;AX:=Хсол

XCHG AX,WORD PTR X+2 ;AX:=Хо,Хсол:=Хсол

MOV WORD PTR X,AX ;Хсол:=Хоны брыны мні

Осы мысалды олданып команданы жазылуын ысарту жолдарыны бірін арастырайы. Кріп отыранымыздай бізді командаларымызда WORD PTR конструкциясы біренеше рет олданылады. Осы конструкцияны айта-айта жаза бермеу шін EQU директивасыны кмегімен оны ысаша атауа болады:

WP EQU WORD PTR

MOV AX,WP X

XCHG AX,WP X+2

MOV WP X,AX

 

Шартсыз ту командалары.