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

АТ–ның командалар жүйесінде біршама орналастыру командалары бар, мұнда біз 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

 

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