Санны лшемін згерту

Мысал арастырайы. Айталы ВХ регистріндегі сана AL регистріндегі санды осу ажет болсын: ВХ=ВХ+AL. Мнда сзді байтпен осу керек, осылатын сандарды лшемдері (типтері) сйкес болу ажеттігі айтылан. Сондытан, алдымен оларды лшемдерін сйкестендіріп алу керек. Ол шін AL–ді АХ регистрне жазу арылы сзге зартуа болады.

Егер сан табасыз болса, онда жеіл жасалады. Бл жадайда берілген операндты жоары разрядтарын нлдермен толтыру арылы жаа операнд алынады. Мысалы, егер AL=32=20h, AX=0020h.

MOV AH,0 ;AL ® AX

Табалы санлар шін программаны орындалу барысында бл мселені шешу иына тседі, опенандты табасын ескеру керек. Осыан орай процессорды командалар жйесіне типтерді згерту командалары енгізілген. Бл командалар байты сзге (CBW, AL–ді АХ-ке), сзді екіеселі сзге (CWD, АХ-ті DX:AX-ке), сзді екіеселі сзге (CWDЕ, АХ-ті ЕAX-ке), екіеселі сзді (CDQ, EАХ-ті EDX:ЕAX-ке) тртеселі сзге зартады.

CBW жне CWD 8086/8088 процессорлары шін, ал CWDЕ жне CDQ 80386 процессоры шін

Мысалдар:

MOV AL,32 ;AL = 32d = 20h

CBW ;AX = 0020h (+32 саны сз трінде)

MOV AL,-32 ;AL =-32 = 0E0h

CBW ;AX = 0FFE0h (-32 саны сз трінде)

Жоарыдаы мысала оралса, сандарды табалы немесе табасыз болуына байланысты тмендегідей шешіледі:

; табасыз сандар шін

MOV АН,0 ;ALàAX

ADD BX,AX

; табалы сандар шін

CBW

ADD BX,AX

Кбейту командалары

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

Табасыз сандарды кбейту: MUL OP

Табалы сандарды кбейту: IMUL OP

Бл командаларды орындалу алгоритмі ртрлі боланымен баса жадайдаы рекеттері бірдей:

Байттарды кбейту: AX= AL * OP (ор: rеg8, mem8)

Сздерді кбейту: (DX,AX)= AX * OP (op: rеg16, mem16)

Еселі сздерді кбейту: (EDX,EAX)= AX * OP (op: rеg32, mem32)

Командада крсетілетін OP - операнд – кбейткіш, ол регистрде немесе жад яшыында болуы ммкін, ал тікелей операнд бола алмайды. Кбейгішті орны алдын ала белгілі, сондытан командада айын крсетілмейді: ол байттарды кбейткенде AL регистрі, сздерді кбейткенде AX регистрі, ал екіеселі сздерді кбейткенде ЕAХ регистріне жазылады.

Нтижені орыны да белгілі, сондытан ол да командада айын крсетілмейді. Жне кбейтіндіге кбейгіштерден екі есе арты орын беріледі. Байттарды кбейткенде нтиже сз лшемді болады да AX регистріне (АН-а жоары, ал AL –ге кіші разрядтары), сздерді кбейткенде нтиже екіеселі сз лшемді болады да DX, AX регистрлеріне (DX-ке жоары, ал AХ–ке кіші разрядтары), ал екіеселі сздерді кбейткенде нтиже тртеселі сз лшемді болады да ЕDX, ЕAX регистрлеріне (ЕDX-ке жоары, ал ЕAХ–ке кіші разрядтары) жазылады.

Сонымен, кбейтінді екі бліктен трады екен. Нтижені бір регистрге сиандыын программаны орындалу барысында CF жне OF регистрлерін тексеру арылы білуге болады:

· егер нтижені жоары блігі нл болса, онда CF=0 жне OF=0;

· егер CF=1 жне OF=1 болса, онда нтиже екі бліктен трады.

5.3.4.1-мысал. Айталы Х - мні табалы сан болып келетін байт лшемді, ал Y- сз лшемді айнымалы болсын. Y=X*X*X рнегін есептеу керек, нтиже сз лшемді болу керек.

Шешуі. ДК-ді арифметикалы командаларын олданан кезде операндтарды лшемін, сандарды табалы, не табасыз екендігін мият адаалау керек. Ал егер кбейту, блу жне табамен зарту операциялары олданылса, онда осы амалдарды операндтарыны ажетті регистрлерде орналасуын адаалау керек.

Бізді мысалда алдымен Х байтын з-зіне кбейтеміз. IMUL командасыны операндтарыны бірі AL регистрінде орналасу керек боландытан е алдымен Х-ті осы регистрге жазамыз. АХ регистрінде Х*Х рнегіні нтижесін аламыз. ДК-де сзді байта кбейтуге болмайтындытан Х байтын табамен сзге дейін зартамыз, ол шін CBW командасын олданамыз. Бл команда АХ регистрін олданатындытан АХ регистрін босату керек. X*X*X рнегіні нтижесі екіеселі сз болатындытан ол DX жне АХ регистрлерінде орналасады. Есепті шартына байланысты орытынды нтиже сз лшемді болу керек, сондытан DX регистрін ескермесек те болады.

Осыны брін ескеріп келесі командаларды аламыз:

MOV AL,X

IMUL AL ;AX=X*X (IMUL X олдануа болады)

MOV BX,AX ;AX регистрін босату

MOV AL,X

CBW ;AX=X сз ретінде

IMUL BX ;(DX,AX)=X*X*X(DX-ті ескермеуге болады)

MOV Y,AX

5.3.4.2-мысал. Байт лшемді А, В айнымалылары берілген. y=ab+(а3+1)(в2-1) рнегін есептеу керек.

Шешуі. Алдымен А жне В айнымалыларын кбейтіп, нтижені сатап алу шін Y–ке меншіктейміз. Сонан со бірінші жашадаы амалдарды орындап, нтижені Z- ке меншіктейміз. Ары арай екінші жашаны амалдарын орындап нтижесін Z-те саталан бірінші жашаны мніне кбейтіп нтижені Y айнымалысына осамыз

A DB ? ;A берілетін млімет, байт лшемді

B DB ? ;A берілетін млімет, байт лшемді

Z DW ? ;Z-аралы айнымалы, сз лшемді

Y DW ? ;Y-нтиже, сз лшемді

. . .

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

Паскальа кіріктірілген Ассемблерде жазылан программа мтіні:

Program missal5_3_4_2;

Var

a,b:byte; y,z: integer;

begin

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

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

ASM

;A мен В-ны кбейтіп Y-ке меншіктейміз

MOV AL,A ;AL=A

MUL B ;AX=AL*B

MOV Y,AX ;Y=AX

;Бірінші жашаны есептеп нтижені z-ке меншіктейміз

MOV AL,A ;AL=A

MUL A ;AX=A*A

MUL A ;AX=А*A*A

INC AX ;AX=А*A*A+1

MOV Z,AX ;Z=А*A*A+1

;Екінші жашаны есептейміз

MOV AL,B ;AL=B

MUL B ;AX=AL*B

DEC AX ;AX=AX-1

;Екінші жаша нтижесін z-ке кбейтіп y-ке осамыз

MUL Z ;AX=AX*Z

ADD Y,AX ;Y+AX

End;

Writeln('Нтиже=',Y);

Readln

end.

Дріс №4.

Таырыбы:Арифметикалы командалар.

Жоспары: Бтін сандарды осу жне алу ерекшеліктері. осу жне алу командалары. Санны лшемін згерту. Кбейту командалары. Блу командалары.

Блу командалары

Блу командаларыкбейту трізді табалы жне табасыз сандарды блу де екі командамен жзеге асырылады:

Табасыз бтін санды блу: DIV op

Табалы бтін санды блу: IDIV op

Блгіш жад яшыында немесе регистрде болуы ммкін, жне де лшемі 8 (байт), 16 (сз) жне 32 (екіеселі сз) бит бола алады. Блінгішті орны алдын ала белгілі, сондытан командада айын крсетілмейді: сзді байта блгенде AХ регистрі, екіеселі сзді сзге блгенде (DX,AX) регистрлері, ал тртеселі сзді екіеселі сзге блгенде (EDX,EAX) регистрлерінде деп есептеледі. Блу командасыны нтижесінде бліндіні бтіні мен алдыы табылады.

Сзді байта блу:

AH:=AX mod op, AL:=AX div op (op:reg8,mem8)

Екіеселі сзді сзге блу:

DX:=(DX,AX) mod op, AX:=(DX,AX)div op (op:reg16,mem16)

Тртеселі сзді сзге блу:

EDX:=(EDX,EAX) mod op, AX:=(EDX,EAX)div op (op:reg32,mem32)

Блу командалары орындаланнан со кй жалаушалары згетілмейді, біра «нлге блу» ателігі туындауы ммкін. Бл ателікті пайда болу себептері:

· блгіш нлге те;

· блінді оан берілген разрядтар торына симайды.

Бір типті сандарды блуде блінгішті зарту шін кбіне cандарды лшемін згерту командалары олданылады. Мысалы AL:=AL div CH былай жасалады:

; табасыз сандар шін

MOV АН,0 ;ALàAX

DIV CH ;AL = AL div CH (AH = AL mod CH)

; табалы сандар шін

CBW ;ALàAX

ADD BX,AX ;AL = AL div CH (AH = AL mod CH)

 

5.3.5.1-мысал. Келесі рнекті есептеу керек:

Мндаы N, M байт лшемді айнымалылар.

Шешуі. рнекті ш блікке бліп есептейміз. Е алдымен берілген блшекті блімін есептеп аламыз. Нтижені сатап алып АХ регистрін босату шін андай да бір айнымалаа (A-а) меншіктеп оямыз. Ол айнымалы сз лшемді болуы тиісті. Екіншіден, блшекті алымын есептеп, шыан нтижені А-а блеміз. Ассемблер А айнымалысын байт ретінде абылдау шін PTR командасын олданамыз. Е соында блуді нтижесі алды жне бтін блік трінде AL жне AH регистрлернде саталатындытан скесінше осы регистрлердегі нтижелерді Z жне Y айнымалыларына меншіктейміз.

N DB ? ;n берілетін млімет, байт лшемді

M DB ? ;m берілетін млімет, байт лшемді

Y DB ? ;Y-ке нтижені бтіні жазылады, байт лшемді

Z DB ? ;Z-ке нтижені бтіні жазылады, байт лшемді

A DW ? ;A-аралы айнымалы, сз лшемді

. . .

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

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

Program missal5_3_5_1;

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

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

Var

m,n,y,z:byte;

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

Procedure mis5_3_5_1 (var m,n:byte; var y,z:byte);{FAR;} external;

begin

Writeln('m='); Readln(m);

Writeln('n='); Readln(n);

mis5_3_5_1(m,n,y,z);

Writeln('Бтіні=',Y,';алдыы=',z);

Readln

end.

Ассемблерде жазылан MIS5_3_5_1ASM.asm модуліні мтіні:

; mis5_3_5_1.asm

.MODEL Large

.data

; мліметтер Паскальдан алынып-беріледі

; m,n берілетін млімет, байт лшемді

Extrn m:byte, n:byte

; Y-ке нтижені бтіні жазылады, байт лшемді

; Z-ке нтижені бтіні жазылады, байт лшемді

Extrn Y:byte, Z:byte

A DW ? ;A-жергілікті айнымалы, сз лшемді

.code

Public mis5_3_5_1

mis5_3_5_1 proc far

;Блшекті блімін есептеу

MOV AL,N ;AL=N

MUL N

MUL N ;AX=AL*N*N

INC AX ;AX=AX+1

MOV A,AX ;A=AX

;Блшекті алымын есептеу

MOV AL,M ;AL=M

MUL M ;AX=AL*M

DEC AX ;AX=AX-1

DIV BYTE PTR A ;A-ны байт ретінде абылдау

;Блінді нтижесін Y жне Z айнымалыларына меншіктеу

MOV Y,AL ;Y=AX DIV A

MOV Z,AH ;Z=AX MOD A

ret

mis5_3_5_1 endp End

 

Дріс №5

Таырыбы: Шартсыз ту. Салыстыру жне шартты ту командалары. Шартты ту командалары

Жоспары. Шартсыз ту. Тура ту. Жанама ту. Сегментіші (жаын) ту. Сегментарлы (алша) ту.Салыстыру командаларынан со олданылатын шартты ту командалары. андайда бір аныталан жалаушаларды мндеріне байланысты ту. СХ регистріні мнін тексеру арылы ту.

 

детте машиналы программаны командалары, жадта жазылан кйінде, бірінен со бірі біртіндеп орындалады. Бірата программаны орындалу алгоритмі бойынша ол алыпты ретті згертіп отыру ажет болады. Ол шін, яни келесі орындалатын командаа ту шін басару командалары (шешім абылдау командалары) олданылады. Бл командаларды программалау тілдерінде ысаша ту командаларды деп те атайды. Біз осы терминді пайдаланамыз.

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

Шешім абылдау командаларымен танысуды шарттыз ту командаларынан бастаймыз.