Download presentation
Presentation is loading. Please wait.
1
زبان ماشین و اسمبلی – درس هفتم و هشتم
دستورات محاسباتی در قالبهای BCD ، ASCII و ... دانشگاه آزاد اسلامی – مشهد 1385 علمی
2
اعداد BCD در کدگزاری BCD هر رقم دهدهی با 4 بیت نمایش داده می شود.
0000 0001 1 در کدگزاری BCD هر رقم دهدهی با 4 بیت نمایش داده می شود. 6 ترکیب 1010 تا 1111 حاوی هیچگونه داده ای نیستند 0010 2 0011 3 0100 4 0101 5 0110 6 0111 7 1000 8 1001 9 1010 1011 1100 بلا استفاده 1101 1110 1111
3
اعداد BCD BCD فشرده BCD غیر فشرده 1 رقم دسیمال 1 رقم دسیمال
4
جمع اعداد BCD اگر مجموع دو رقم کمتر از ده باشد مشکلی ایجاد نخواهد شد
اگر مجموع دو رقم بیشتر از نه شود کدهای حاصل کدهای بی معنی خواهند بود ( در بازه 10 تا 15)
5
مثال 195 182 , , , , + در صورتی که حاصلجمع دو رقم بیش از 9 باشد باید جواب تحصیص شود یعنی عدد نه به آن رقم افزوده شود , ,
6
Decimal Adjust Afer Addition
دستور جمع BCD دستورات معمولی جمع به کار برده میشوند پس از جمع جواب باید تصحیح شود داده های BCD به صورت فشرده فرض شده اند Decimal Adjust Afer Addition DAA
7
نگاه دقیق تر به دستورDAA
AF CF AH 4 بیت AL4 بیت BH4 بیت BL4 بیت + CH4 بیت CL4 بیت IF ( CF=1 ) OR (CH>9) THEN CL = CL + 6 IF ( AF=1 ) OR (CL>9) THEN CL = CL + 6
8
Decimal Adjust after Substraction
تفریق BCD ابتدا دستورات معمولی تفریق بکار برده می شود سپس نتیجه اصلاح می شود DAS Decimal Adjust after Substraction
9
اصلاح اعداد BCD دستورات DAA و DAS فقط بر روی AL عمل می کنند
این دستورات باید بلافاصله بعد از دستور جمع اجرا شوند
10
تمرین برنامه ای بنویسید که دو عدد 10 رقمی را به روش BCD با هم جمع کند . برنامه قبلی را برای تفریق نیز اجرا نمایید .
11
اعداد به صورت اسکی 48 30H 1 49 31H 55 +53 ‘7’ +’5’ 2 50 32H 12 108 3
48 30H 1 49 31H 55 +53 ‘7’ +’5’ 2 50 32H 12 108 3 51 33H -96 4 52 34H 5 53 35H 6 54 36H 7 55 37H 8 56 38H 9 57 39H 1 بایت
12
جمع و تفریق اعداد ASCII جمع معمولی / تفریق معمولی اصلاح نتیجه AAA
ASCII Adjust after Addition AAS ASCII Adjust after Substraction در هر دو دستور اپرند در AL قرار دارد AAM ASCII Adjust after Multiplication اپرند در AX قرار دارد
13
اصلاح ضرب اسکی هر دو عدد به صورت BCD غیر فشرده باشند
برای تبدیل اعدا اسکس به BCD کافی است آنها را با 0FH ، AND کنیم
14
مثال ضرب اعدا 7 و 9 MOV AL, ‘9’ AND AL,0F MOV BL,9 MUL BL AAM
OR AX, 3030H AL=37H AL=07H BL=39H BL=09H AX=003FH AX=0603 AX=3633H=‘6’’3’
15
تنظیم کد اسکی قبل از تقسیم
مقسوم کد BCD غیر فشرده مقسوم در AX مقسوم علیه کد BCD غیر فشرده خارج قسمت در AL باقیمانده درAH AAD ASCII Adjust after Division
16
مثال : تقسیم عدد 52 بر 7 AX=3532H MOV AX,3532 AX=0502 AND AX,0F0FH AAD
MOV DL,’7’ AND DL,0FH DIV DL OR AX,3030H AX=3532H AX=0502 AX=0034H DL=37H DL=07H AL=07H AH=03H AX=3337H
17
تبدیل کداسکی به BCD غیرفشرده
فقط کافی است چهار بیت بالایی صفر شوند ‘6’ AND 0FH 36H 06H
18
تبدیل کداسکی به BCD غیرفشرده
3X 3X AND OF 0X 0X 0000xxxx 0000XXXX xxxxXXXX
19
Stacksg segment stack ‘stack’ Dw 32h dup(0) Stackseg ends
Datasg segment ‘data’ X dB ’57’ Y dB ? Datasg ends Codesg segment ‘code’ Assume ss:stacksg,ds:datasg , cs:codesg Main : proc far Mov ax,datasg Mov ds,ax ; MOV AX, WORD PTR X AND AX,0F0FH XCHG AL,AH MOV CL,4 SHL AH,CL OR AL,AH MOV Y,AL ; Mov ax,4c00h Int 21h Main endp Codesg ends End main
20
تبدیل کد BCD فشرده به اسکی
X X X X Y Y Y Y X X X X Y Y Y Y AND =0FH SHIFT RIGHT X X X X Y Y Y Y
21
تمرین برنامه ای بنویسید که عدد 95 را که در یک بایت حافظه به صورت BCD ذخیره شده است را به اسکی تبدیل نماید
22
دستورات کنترلی انشعاب غیرشرطی مشابه دستور GOTO انشعاب شرطی مشابه با IF
23
JMP JMP LABEL MOV AX , A00 L1 : INC ADD AX,BX JMP L1 حلقه بی نهایت
24
LOOP هر بار یک واحد از CX کم می کند
برای ایجاد حلقه FOR مناسب است MOV AX,O MOV X,AX MOV CX,20 FOR : MOV AX,X INC LOOP FOR For(i=0;i<20;i++) X++;
25
CMP مقایسه دو عدد (COMPARE) OP1=OP2 1 OP1>OP2 OP1<OP2
CMP OP1,OP2 OF CF ZF SF OP1=OP2 1 OP1>OP2 OP1<OP2 ZF OP1-OP2 AF DF OP1 و OP2 تغییر نمی کنند CF
26
CMP AX,BX CMP AX, Z CORRECT USE CMP Z, AX CMP AX,120 CMP ,Y ERROR CMP , CX
27
LOOPZ حلقه تا زمانی که نتیجه باشد MOV CX,10 I=10; LABEL : MOV AX,X
ADD AX,Y MOV X,AX CMP AX,1200 LOOPZ LABEL I=10; WHILE ( I # 0) AND (X=1200) { X=X+Y I--; } LOOPE علاوه بر CX ، ZF را نیز بررسی می کند بلافاصله با غیر صفر شدن نتیجه یک محاسبه ZF=0 شده و از حلقه خارج میشود WHILE ( CX#0) AND ( ZF=1) { }
28
LOOPE دقیقا مثل LOOPZ است با عدم تساوی دو اپرند مطمئنا ZF=0 است
دلیل استفاده از این دستور ؟ خوانایی برنامه ؟؟؟؟
29
دستور LOOPNE هم به همین معنی بکار برده میشود
LOOPNZ حلقه تا زمانی که : CX صفر نشده نتیجه محاسبات غیر صفر شود خروج از حلقه CX صفر شود نتیجه محاسبه صفر شود ( تساوی) WHILE(CX#0) AND (ZF=0) { } دستور LOOPNE هم به همین معنی بکار برده میشود
30
دستورات پرش شرطی این دستورات از فلگ ها اثر می پذیرند
قبل از این دستورات پردازش لازم جهت تغییر فلگ ها انجام میشود مبتنی بر فلگ ها برای اعداد علامتدار دستورات پرشی برای اعداد بی علامت
31
JUMP NOT SIGN (POSITIVE)
پرش مبتنی بر فلگ ها JUM SIGN (NEGATIVE) SF=1 JS JUMP NOT SIGN (POSITIVE) SF=0 JNS JUMP CARRY CF=1 JC JUMP NOT CARRY CF=0 JNC JUMP OVERFLOW OF=1 JO JUMP NOT OVERFLOW OF=0 JNO JUMP PARITY PF=1 JP JUMP NOT PARITY PF=0 JNP
32
پرش برای اعداد بی علامت JUMP EQUAL JE OP1=OP2 JUMP NOT EQUAL JNE
JUMP ABOVE JA OP1>OP2 JUM ABOVE OR EQUAL JAE OP1>=OP2 JUMP BELOW JB OP1<OP2 JUMP BELOW OR EQUAL JBE OP1<=OP2
33
پرش برای اعداد علامتدار
JUMP EQUAL JE OP1=OP2 JUMP NOT EQUAL JNE OP1#OP2 JUMP GREATER JG OP1>OP2 JUMP GREATER OR EQUAL JGE OP1>=OP2 JUMP LESS JL OP1<OP2 JUMP LESS OR EQUAL JLE OP1<=OP2
34
;-----------------------------------------------
; Define stack segment ; STACKSG SEGMENT STACK 'STACK' DW 32H DUP(0) ; 32H word for stack STACKSG ENDS ; End of segment ; 2- Define data segment DATASG SEGMENT 'DATA' MESSAGE DB 'IT IS TOO HOT','$' ORG 1500 ARRAY DB 20,30,32,20,12,40,15,8,12,20 DATASG ENDS ;End of segment ; Define code segment ; ; CODESG SEGMENT 'CODE' ASSUME SS:STACKSG,DS:DATASG,CS:CODESG MAIN PROC FAR MOV AX,DATASG ;1-Initialize DS MOV DS,AX ;2- register
35
LEA DI,ARRAY ;3-DI= address of ARRAY
MOV CX, ;4-CX= 10 as a counter DEC DI ;5-Decremnet pointer AGAIN: INC DI ;6-Increment pointer CMP BYTE PTR [DI], ;7- Compare [DI] & LOOPNE AGAIN ;8- 40 go AGAIN, not equal JNE EXIT ;9-If not equal go EXIT MOV AH, ;10- Else print MESSAGE: LEA DX,MESSAGE ;11- IT SI TOO HOT on INT 21H ;12- monitor EXIT: MOV AX,4C00H ;13- End of INT 21H ;14- processing MAIN ENDP ; End of procedure CODESG ENDS ; End of segment END MAIN ; End of program
36
نکات مهم تمامی دستورات پرشی SHORT هستند یعنی حداکثر 127 بایت پایین تر یا 128 بایت بالاتر پرش می کنند دستورات پرشی دیگری هم وجود دارد که همین اعمال را انجام میدهند برای پرش های دورتر باید این کار را برنامه نویس انجام دهد دستورات پرش بر روی فلگها تاثیر ندارند
37
.MODEL SMALL .STACK 64 ;Define stack .DATA ;Define data segment FIRST DB 10 SECOND DB 14 ; .CODE ;Define code segment MAIN PROC FAR MOV ;1- Set data segment MOV DS,AX ;2- address ; MOV BL,FIRST ;3-BL=10 MOV CL,SECOND ;4-CL=15 MOV AL,0 ;5-AL=0 AGAIN: ADD AL,BL ;6-AL=AL+BL INC BL ;7-BL=BL+1 CMP BL,CL ;8-Cmopare BL & CL,if JLE AGAIN ;9- BL <= CL go to
38
; ;AGAIN ; MOV AX,4C00H ;10-End of INT 21H ;11- processing MAIN ENDP ; End of procedure END MAIN ; End of program
39
در اغلب موارد از رجیستر CX به عنئان شمارنده حلقه ها استفاده میشود
JCXZ JCXZ LABEL JUMP if CX is ZERO در اغلب موارد از رجیستر CX به عنئان شمارنده حلقه ها استفاده میشود
40
;----------------------------------------------------------
; Stack segment ; STACKSG SEGMENT STACK 'STACK' DW 10 DUP(0) STACKSG ENDS ; Data segment ; DATASG SEGMENT 'DATA' DATA1 DB 22 DUP (4) DATASG ENDS ; Code segment COSEG SEGMENT 'CODE' ASSUME CS:COSEG, DS:DATASG, SS:STACKSG MAIN PROC FAR MOV AX,DATASG ;1-Initialize DS MOV DS,AX ;2- register ; MOV SI, ;3-Set SI to first memory location MOV DI,0 ;4-Set DI to first memory location
41
BACK1: INC DI ;5-Set DI to next memory location
MOV AL,[SI] ;6-Move content of [SI] to AL BACK2: CMP AL,[DI] ;7- & compare with [DI] JAE SORT1 ;8-Jump if above or equal to SORT1 XCHG AL,[DI] ;9- else exchange with AL MOV [SI],AL ;10-Move AL to [SI] SORT1: INC DI ;11-Increment DI CMP DI,16 ;12-Compare DI with 16 JB BACK2 ;13- if below go to BACK2 INC SI ;14-Else increment SI MOV DI,SI ;15-Make DI equal to SI CMP SI,15 ;16-Compare SI to 15 JL BACK1 ;17- if less go to BACK1 MOV AX,4C00H ;18-Else end of INT 21H ;19- processing MAIN ENDP ;End of procedure COSEG ENDS ;End of code segment END MAIN ;End of program
42
سابروتین PROCNAME PROC ---------- RET PROCNAME ENDP MAIN :----------
CALL PROCNAME PROCNAME PROC RET PROCNAME ENDP
43
روال فراخوانی سابروتین
ذخیره آدرس بازگشت در پشته IP NEAR انواع سابروتین CS IP FAR
44
MAIN PROGRAM ( CALL PROCEDURS) PROCEDURE DECLARATION
Codesg segment ‘code’ Assume ss:stacksg,ds:datasg , cs:codesg Main : proc far Mov ax,datasg Mov ds,ax ; ; Mov ax,4c00h Int 21h Main endp ; Codesg ends End main MAIN PROGRAM ( CALL PROCEDURS) PROCEDURE DECLARATION
45
Codesg segment ‘code’ Assume ss:stacksg,ds:datasg , cs:codesg Main : proc far Mov ax,datasg Mov ds,ax ; CALL START CALL SEARCH ; Mov ax,4c00h Int 21h Main endp ; START PROC NEAR ;************** RET START ENDP SEARCH PROC NEAR SEARCH ENDP Codesg ends End main
46
دستورات منطقی عملیات بر روی تک تک بیت ها
اعمال پایه منطقی مثل AND-ORو ... قبل از دستورات کنترلی تاثیر روی فلگها
47
از این دستور می توان برای ماسک کردن یک داده استفاده کرد
AND AND OP1,OP2 SF ZF PF OP1←OP1.OP2 CF=0 OF=0 از این دستور می توان برای ماسک کردن یک داده استفاده کرد
48
مثال OP1 X1 X2 X1.X2 1 OP2 AND
49
از این دستور برای ست کردن تعدادی بیت استفاده می شود
OR OR OP1,OP2 SF ZF PF OP1←OP1+OP2 CF=0 OF=0 از این دستور برای ست کردن تعدادی بیت استفاده می شود
50
از این دستور برای ست کردن تعدادی بیت استفاده می شود
XOR XOR OP1,OP2 SF ZF PF OP1←(OP1) XOR (OP2) CF=0 OF=0 از این دستور برای ست کردن تعدادی بیت استفاده می شود
51
X1 X2 XOR 1 OP1 OP2 XOR تابع XOR یک تابع فرد است
52
MOV AX,0FCH AND AX,0FH AX=? MOV AX,12H AND AX, B
53
MOV BX,04H OR BX,F0H BX=? MOV BX,35H OR BX, B
54
MOV AX,0FCH XOR AX,12H AX=? MOV AX,100 XOR AX,AX
55
تمرین XOR AX,BX XOR BX,AX نتیجه این دستورات چیست ؟
56
تک تک بیت ها معکوس میشوند (مکمل1)
NOT OPERAND تک تک بیت ها معکوس میشوند (مکمل1) فلگها ثابت می مانند TEST OP1,OP2 SF ZF PF AND OP1,OP2 CF=0 OF=0 مقادیر OP1 و OP2 تغییر نمی کند
57
دستورات شیفت SHL OP1,1 SHL OP1,CL SHIFT LEFT SF SAL OP,1 SAL OP,CL
SHIFT ARITHMETIC LEFT ZF PF CF OF CF 7 2 1
58
SHIFT ARITHMETIC RIGHT
دستورات شیفت SHR OP1,1 SHR OP1,CL SHIFT RIGHT SF SAR OP,1 SAR OP,CL SHIFT ARITHMETIC RIGHT ZF PF CF CF منطقی 7 2 1 OF CF ریاضی S 2 1
59
دستورات دوران ROR OP1,1 ROR OP1,CL ROTATE RIGHT SF ZF PF CF OF CF 7 2
60
ROTATE RIGHT THROUGH CARRY FLAG
دستورات دوران ROTATE RIGHT THROUGH CARRY FLAG RCR OP1,1 RCR OP1,CL SF ZF PF CF OF CF 7 2 1
61
دستورات دوران ROL OP1,1 ROL OP1,CL ROTATE LEFT SF ZF PF CF OF CF 7 2 1
62
ROTATE LEFT THROUGH CARRY FLAG
دستورات دوران ROTATE LEFT THROUGH CARRY FLAG RCL OP1,1 RCL OP1,CL SF ZF PF CF OF CF 7 2 1
63
SHIFT ARITHMETIC RIGHT SAR
SHIFT LEFT SHL SHIFT ARITHMETC LEFT SAL SHIFT RIGHT SHR SHIFT ARITHMETIC RIGHT SAR ROTATE RIGHT ROR ROTATE RIGHT THROUGH CARRY RCR ROTATE LEFT ROL ROTATE LEFT THROUGH CARRY RCL
64
Codesg segment ‘code’ Assume ss:stacksg,ds:datasg , cs:codesg MASK1 PROC AND AL,0FH RET MASK1 ENDP MASK2 PROC AND AL,0F0H MASK2 ENDP Main : proc far Mov ax,datasg Mov ds,ax ; MOV AL,X CALL MASK1 MOV X,AL MOV AL,Y CALL MASK2 MOV Y,AL ADD AL,Y MOV Z,AL ; Mov ax,4c00h Int 21h Main endp Codesg ends End main
65
; Define stack segment ; SSEG SEGMENT STACK 'STACK' DW 32H DUP(0) SSEG ENDS ; Define data segment ; DSEG SEGMENT 'DATA' COUNT EQU 05 DATA1 DW ,25000,30000,35000,40000 ORG 20H SUM DW 2 DUP(?) DSEG ENDS ; Define code segment
66
CSEG SEGMENT 'CODE' START PROC FAR ASSUME CS:CSEG, DS:DSEG, SS:SSEG MOV AX,DSEG ;1-Set data segment MOV DS,AX ;2- address ; MOV CX,COUNT ;3-CX=5 MOV SI,OFFSET DATA1 ;4-SI=Offset DATA1 MOV AX,0 ;5-AX=0 MOV BX,AX ;6-BX=0 BACK1: ADD AX,[SI] ;7-Add memory [SI] to AX ADC BX,0 ;8-Add carry to BX INC SI ;9-Increment SI INC SI ;10-SI point next DATA1 DEC CX ;11-Decrement CX JNZ BACK1 ;12-CX #0 back to BACK1 MOV SUM,AX ;13-Else move AX to SUM MOV SUM+2,BX ;14-Move BX to SUM+2
67
; MOV AX,4C00H ;15-End of INT 21H ;16- processing START ENDP ; End of procedure CSEG ENDS ; End of segment END START ; End of program
68
سوال ؟
Similar presentations
© 2025 SlidePlayer.com. Inc.
All rights reserved.