Тармақты құрылымдарды программалау
Ассемблер тілі - машиналық командалар тілі. Мұнда жоғары дәрежелі тілдерге тән басқару құрылымдары (таңдау, тармақтау, циклдарды ұйымдастыру және т.б.) жоқ. Бірақта өту командаларының көмегімен кез келген құрылымдарды ұйымдастыруға болады. Енді ассемблерде осы құрылымдарды жасау жолдарын қарастырамыз.
Тармақ ұйымдастыру. Мысал үшін Паскаль тілінде жазылған мына операторды алайық:
if Х>0 then 1-оператор else 2-оператор;
Ассемблерде бұл операторды мына сұлбалармен жүзеге асыруға болады:
CMP X, 0 | ;X= 0? | CMP X, 0 | ;X= 0 ? | ||
JLE L2 | ;X<=0→L2 | JQ L2 | ;X>0→L2 | ||
1-операторға сәйкес командалар тобы | 2-операторға сәйкес командалар тобы | ||||
JMP FIN | ;→ FIN | JMP FIN | ;→ FIN | ||
L2: | 2-операторға сәйкес командалар тобы | L2: | 1-операторға сәйкес командалар тобы | ||
FIN: | FIN: | ||||
a) | б) |
Бұл сұлбалардан көретініміз: егер операторларды Паскаль операторындағы ретпен орналастыратын болсақ (а-сұлбасы), онда Ассемблерде 2-операторға өту шарты(X<=0) тексеріледі, ал 1-операторға сәйкес командалар тобы салыстыру командасынан соң жазылады да, соңында 2-операторға сәйкес командалар тобын аттап өту үшін шартсыз өту командасы(JMP FIN) жазылады; егер Паскаль операторындағы шарт (X>0) тексерілетін болса, онда командалар топтары кері орналастырылады (б- сұлбасы).
6.3.1-мысал. Үш орынды X бүтін санның цифрларының үлкенін табу керек.
Шешуі. Алдымен берілген бүтін санның цифрларын тауып оларды сәкесінше a, b, c айнымалыларына меншіктейміз:
Y = X div 10, c = X mod 10, b = Y mod 10, a = Y div 10
Сонан соң a мен b айнымалыларын салыстырамыз. Екеуінің үлкенін с айнымалысымен салыстырып, үлкенін Y -ке меншіктейміз.
X DW ? ;X берілген сан, сөз өлшемді
A DB ? ;А берілген X санының бірінші цифры
B DB ? ;В берілген X санының екінші цифры
C DB ? ;С берілген X санының үшінші цифры
Y DB ? ; Y=max(a,b,c)
. . .
;санның цифрларын табу
MOV A,10 ;A=10, DIV командасында пайдалану үшін
MOV AX, X ;AX=X
DIV A ; X div 10
MOV Y, AL ; Y = X div 10
MOV С, AH ; c = X mod 10
MOV Al
cbW ;AX=Y, Y-ті ұзартып AX жазамыз
DIV А ; Y mod 10
MOV B, AL ; b = Y mod 10
MOV C, AH ; a = Y div 10
;MAX(a,b,c)
MOV AL, A ;AL=a, алғашқыда үлкені a деп аламыз
CMP AL,B ;a>b ?
JA M ;егер a>b à M
MOV AL,B ;егер a<=b болса AL=b
M: CMP AL,C ;үлкені>с ?
JA L ; à L
MOV AL,C ;AL=c, енді үлкені с болады
L: MOV Y,AL ;нәтижені меншіктеу
6.3.2-мысал. Берілген шартарға байланысты Y-ті есептейтін өрнекті анықтап мәнін табу керек:
Шешуі. Мұнда, алдымен үшінші шарттың орындалуын тексереміз, егер Ақиқат болса үшінші өрнекті есептеуге (L1 белгісіне) өтеміз, Жалған болса екінші өрнекті таңдау шартын тексеріп, орындалса оны есептеуге (L2 белгісіне) өтеміз, әйтпесе бірінші өрнекті есептеуді бастаймыз. Әр өрнек есептелгеннен соң, басқа өрнектер есептелмес үшін шартсыз өту командасы (JMPL3)қойылады.
X DW ?
Y DW ?
. . .
MOV AX,X ;AX=X
CMP AX,0 ;X=0 ?
JE L1 ;X=0 болса, 3-ші өрнекті есептеуге өтеді
CMP AX,3 ;X<3 ?
Jl L2 ;X<3 болса, 2-ші өрнекті есептеуге өтеді
;Бірінші өрнекті есептеу
MOV AL,BYTE PTR ;X-тің байтын AL-ге жазамыз
MUL AL ;AX=X*Х
ADD AX,2 ;AX=X*Х+2
JMP L3 ;àL3
;Екінші өрнекті есептеу
L2:
DEC AX ;AX=X-1
JMP l3 ;àL3
;Үшінші өрнекті есептеу
L1: INC AX ;AX=X+1
;Нәтижені Y-ке меншіктеу
L3: MOV Y,AX
. . .
Дәріс №6
Тақырыбы: Циклдық құрылымдарды программалау.
Жоспары.. «Әзір» циклын ұйымдастыру.