زبان ماشین و اسمبلی – درس هفتم و هشتم

Slides:



Advertisements
Similar presentations
زبان ماشین و اسمبلی – درس ششم
Advertisements

NEG Instruction Change operand content into two’s complement (negative value) and stored back into its operand mov bl, b neg bl; bl = mov.
ACOE2511 Assembly Language Arithmetic and Logic Instructions.
Computer Organization & Assembly Language
80x86 Instruction Set Dr. Qiang Lin.
ADD Instruction ADD destination,source ADD AX,BX ADD SUM,EAX
Gursharan Singh Tatla 21-Nov-20101www.eazynotes.com.
8086 : INSTRUCTION SET By, Pramod Sunagar Assistant Professor
Flow Control Instructions
9-1 ECE 424 Design of Microprocessor-Based Systems Haibo Wang ECE Department Southern Illinois University Carbondale, IL x86 Instructions Part.
Ch. 7 Logic, Shift and Rotate instr.
به نام خدا برنامه سازی سمت سرور (php)
Executing and Linking an assembly program. Lesson plan Review Program logic and control Practice exercise Assembling, Linking and Executing Programs Practice.
1 Logic, Shift, and Rotate Instructions Read Sections 6.2, 7.2 and 7.3 of textbook.
موضوع: دبير مربوطه: آموزشگاه : اجرا : عبارتهای جبری خانم مقصودی
Assembly Language. Symbol Table Variables.DATA var DW 0 sum DD 0 array TIMES 10 DW 0 message DB ’ Welcome ’,0 char1 DB ? Symbol Table Name Offset var.
زبان ماشین و اسمبلی – درس نهم روشهای آدرسدهی دانشگاه آزاد اسلامی – مشهد علمی.
EEL 3801 Part V Conditional Processing. This section explains how to implement conditional processing in Assembly Language for the 8086/8088 processors.
LEA instruction The LEA instruction can be used to get the offset address of a variable Example ORG 100h MOV AL, VAR1 ; check value of VAR1 by moving it.
Review of Assembly language. Recalling main concepts.
Practical Session 2. Flags Register (Status Register) A flag is a single bit of information whose meaning is independent from any other bit Each flag.
COMP 2003: Assembly Language and Digital Logic Chapter 2: Flags and Instructions Notes by Neil Dickson.
Jumps, Loops and Branching. Unconditional Jumps Transfer the control flow of the program to a specified instruction, other than the next instruction in.
آشنايي با سيستم اعداد.
Assembly language programming
Introduction to assembly programmıng language
Format of Assembly language
Chapter Nov-2010
Practical Session 2.
Chapter instruction description and assembler directives from Microprocessors and Interfacing by Douglas Hall.
Today we are going to discuss about,
Instruction Set of 8086 Microprocessor
Instruksi Set Prosesor 8088
Microprocessor and Assembly Language
EE3541 Introduction to Microprocessors
INSTRUCTION SET.
Assembly IA-32.
INSTRUCTION SET.
Assembly Language Programming Part 2
4.2 Arithmetic Instructions
INSTRUCTION SET OF 8086 PAWAN KUMAR SINGH.
تهیه و تنظیم: فاطمه قاسمی دانشگاه صنعتی شریف – پاییز 86
اصول اساسی برنامه نویسی به زبان اسمبلی
CS 301 Fall 2002 Assembly Instructions
X86’s instruction sets.
دانشگاه صنعتی امیرکبیر باری بی.بری
بنام خدا زبان برنامه نویسی C (21814( Lecture 12 Selected Topics
Computer Organization and Assembly Language
SY800 router mode [AD-14-TB ].
فصل پنجم انشعاب و حلقه.
ارايه دهنده : حسن عسكرزاده
اصول اساسی برنامه نویسی به زبان اسمبلی
Microprocessor Lab CSL1543 0:0:2
תכנות בסיסי בשפת סף פרק 5 מצגת 3.
Data formats or Instruction formats of 8086:
Shift & Rotate Instructions)
دانشگاه آزاد اسلامی واحد جزیره هرمز
بسم الله الرحمن الرحیم هرس درخت تصمیم Dr.vahidipour Zahra bayat
با تشکر از جناب آقای مهندس بگ محمدی
ADDITION Register Addition. ADD AX,BX AX=AX+BX 2. Immediate Addition.
فصل ششم مدارهای ترتیبی.
مدار منطقي مظفر بگ محمدي
مدار منطقي مظفر بگ محمدي
kbkjlj/m/lkiubljj'pl;
Instructions: Language of the Computer
مباني كامپيوتر و برنامه سازي Basics of Computer and Programming
مباني كامپيوتر و برنامه سازي Basics of Computer and Programming
UNIT-II Assembly Language Programs Involving Logical
Chapter 8: Instruction Set 8086 CPU Architecture
Computer Architecture and Assembly Language
Presentation transcript:

زبان ماشین و اسمبلی – درس هفتم و هشتم دستورات محاسباتی در قالبهای BCD ، ASCII و ... دانشگاه آزاد اسلامی – مشهد 1385 علمی

اعداد 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

اعداد BCD BCD فشرده BCD غیر فشرده 1 رقم دسیمال 1 رقم دسیمال

جمع اعداد BCD اگر مجموع دو رقم کمتر از ده باشد مشکلی ایجاد نخواهد شد اگر مجموع دو رقم بیشتر از نه شود کدهای حاصل کدهای بی معنی خواهند بود ( در بازه 10 تا 15)

مثال 195 182 0 0 0 1,1 0 0 1,0 1 0 1 0 0 0 1,1 0 0 0,0 0 1 0 + در صورتی که حاصلجمع دو رقم بیش از 9 باشد باید جواب تحصیص شود یعنی عدد نه به آن رقم افزوده شود 0 0 1 1,0 0 0 1,0 1 1 0 3 1 4 + 6 3 7 4

Decimal Adjust Afer Addition دستور جمع BCD دستورات معمولی جمع به کار برده میشوند پس از جمع جواب باید تصحیح شود داده های BCD به صورت فشرده فرض شده اند Decimal Adjust Afer Addition DAA

نگاه دقیق تر به دستور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

Decimal Adjust after Substraction تفریق BCD ابتدا دستورات معمولی تفریق بکار برده می شود سپس نتیجه اصلاح می شود DAS Decimal Adjust after Substraction

اصلاح اعداد BCD دستورات DAA و DAS فقط بر روی AL عمل می کنند این دستورات باید بلافاصله بعد از دستور جمع اجرا شوند

تمرین برنامه ای بنویسید که دو عدد 10 رقمی را به روش BCD با هم جمع کند . برنامه قبلی را برای تفریق نیز اجرا نمایید .

اعداد به صورت اسکی 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 بایت

جمع و تفریق اعداد ASCII جمع معمولی / تفریق معمولی اصلاح نتیجه AAA ASCII Adjust after Addition AAS ASCII Adjust after Substraction در هر دو دستور اپرند در AL قرار دارد AAM ASCII Adjust after Multiplication اپرند در AX قرار دارد

اصلاح ضرب اسکی هر دو عدد به صورت BCD غیر فشرده باشند برای تبدیل اعدا اسکس به BCD کافی است آنها را با 0FH ، AND کنیم

مثال ضرب اعدا 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’

تنظیم کد اسکی قبل از تقسیم مقسوم کد BCD غیر فشرده مقسوم در AX مقسوم علیه کد BCD غیر فشرده خارج قسمت در AL باقیمانده درAH AAD ASCII Adjust after Division

مثال : تقسیم عدد 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

تبدیل کداسکی به BCD غیرفشرده فقط کافی است چهار بیت بالایی صفر شوند ‘6’ AND 0FH 36H 06H 0000 0110

تبدیل کداسکی به BCD غیرفشرده 3X 3X AND OF 0X 0X 0000xxxx 0000XXXX xxxxXXXX

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

تبدیل کد BCD فشرده به اسکی X X X X Y Y Y Y X X X X Y Y Y Y AND 00001111=0FH SHIFT RIGHT 0 0 0 0 X X X X 0 0 0 0 Y Y Y Y

تمرین برنامه ای بنویسید که عدد 95 را که در یک بایت حافظه به صورت BCD ذخیره شده است را به اسکی تبدیل نماید

دستورات کنترلی انشعاب غیرشرطی مشابه دستور GOTO انشعاب شرطی مشابه با IF

JMP JMP LABEL MOV AX , A00 L1 : INC ADD AX,BX JMP L1 حلقه بی نهایت

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++;

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

CMP AX,BX CMP AX, Z CORRECT USE CMP Z, AX CMP AX,120 CMP 120,Y ERROR CMP 200, CX

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) { }

LOOPE دقیقا مثل LOOPZ است با عدم تساوی دو اپرند مطمئنا ZF=0 است دلیل استفاده از این دستور ؟ خوانایی برنامه ؟؟؟؟

دستور LOOPNE هم به همین معنی بکار برده میشود LOOPNZ حلقه تا زمانی که : CX صفر نشده نتیجه محاسبات غیر صفر شود خروج از حلقه CX صفر شود نتیجه محاسبه صفر شود ( تساوی) WHILE(CX#0) AND (ZF=0) { } دستور LOOPNE هم به همین معنی بکار برده میشود

دستورات پرش شرطی این دستورات از فلگ ها اثر می پذیرند قبل از این دستورات پردازش لازم جهت تغییر فلگ ها انجام میشود مبتنی بر فلگ ها برای اعداد علامتدار دستورات پرشی برای اعداد بی علامت

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

پرش برای اعداد بی علامت 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

پرش برای اعداد علامتدار 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

;----------------------------------------------- ; 1- 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 ; 3- 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

LEA DI,ARRAY ;3-DI= address of ARRAY MOV CX,10 ;4-CX= 10 as a counter DEC DI ;5-Decremnet pointer AGAIN: INC DI ;6-Increment pointer CMP BYTE PTR [DI],40 ;7- Compare [DI] & LOOPNE AGAIN ;8- 40 go AGAIN, not equal JNE EXIT ;9-If not equal go EXIT MOV AH,09 ;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

نکات مهم تمامی دستورات پرشی SHORT هستند یعنی حداکثر 127 بایت پایین تر یا 128 بایت بالاتر پرش می کنند دستورات پرشی دیگری هم وجود دارد که همین اعمال را انجام میدهند برای پرش های دورتر باید این کار را برنامه نویس انجام دهد دستورات پرش بر روی فلگها تاثیر ندارند

.MODEL SMALL .STACK 64 ;Define stack .DATA ;Define data segment FIRST DB 10 SECOND DB 14 ;----------------------------------------------- .CODE ;Define code segment MAIN PROC FAR MOV AX,@data ;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

; ;AGAIN ; MOV AX,4C00H ;10-End of INT 21H ;11- processing MAIN ENDP ; End of procedure END MAIN ; End of program

در اغلب موارد از رجیستر CX به عنئان شمارنده حلقه ها استفاده میشود JCXZ JCXZ LABEL JUMP if CX is ZERO در اغلب موارد از رجیستر CX به عنئان شمارنده حلقه ها استفاده میشود

;---------------------------------------------------------- ; 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,0 ;3-Set SI to first memory location MOV DI,0 ;4-Set DI to first memory location

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

سابروتین PROCNAME PROC ---------- RET PROCNAME ENDP MAIN :---------- CALL PROCNAME PROCNAME PROC ---------- RET PROCNAME ENDP

روال فراخوانی سابروتین ذخیره آدرس بازگشت در پشته IP NEAR انواع سابروتین CS IP FAR

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

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

دستورات منطقی عملیات بر روی تک تک بیت ها اعمال پایه منطقی مثل AND-ORو ... قبل از دستورات کنترلی تاثیر روی فلگها

از این دستور می توان برای ماسک کردن یک داده استفاده کرد AND AND OP1,OP2 SF ZF PF OP1←OP1.OP2 CF=0 OF=0 از این دستور می توان برای ماسک کردن یک داده استفاده کرد

مثال 1 0 0 1 1 0 1 0 OP1 X1 X2 X1.X2 1 0 0 1 1 0 1 0 1 OP2 AND 0 0 0 1 0 0 0 0

از این دستور برای ست کردن تعدادی بیت استفاده می شود OR OR OP1,OP2 SF ZF PF OP1←OP1+OP2 CF=0 OF=0 از این دستور برای ست کردن تعدادی بیت استفاده می شود

از این دستور برای ست کردن تعدادی بیت استفاده می شود XOR XOR OP1,OP2 SF ZF PF OP1←(OP1) XOR (OP2) CF=0 OF=0 از این دستور برای ست کردن تعدادی بیت استفاده می شود

X1 X2 XOR 1 1 0 0 1 1 0 1 0 OP1 0 0 1 1 0 1 0 1 OP2 XOR 1 0 1 0 1 1 1 1 تابع XOR یک تابع فرد است

MOV AX,0FCH AND AX,0FH AX=? MOV AX,12H AND AX,01010101B

MOV BX,04H OR BX,F0H BX=? MOV BX,35H OR BX,01010101B

MOV AX,0FCH XOR AX,12H AX=? MOV AX,100 XOR AX,AX

تمرین XOR AX,BX XOR BX,AX نتیجه این دستورات چیست ؟

تک تک بیت ها معکوس میشوند (مکمل1) NOT OPERAND تک تک بیت ها معکوس میشوند (مکمل1) فلگها ثابت می مانند TEST OP1,OP2 SF ZF PF AND OP1,OP2 CF=0 OF=0 مقادیر OP1 و OP2 تغییر نمی کند

دستورات شیفت 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

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

دستورات دوران ROR OP1,1 ROR OP1,CL ROTATE RIGHT SF ZF PF CF OF CF 7 2

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

دستورات دوران ROL OP1,1 ROL OP1,CL ROTATE LEFT SF ZF PF CF OF CF 7 2 1

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

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

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

; Define stack segment ; -------------------- SSEG SEGMENT STACK 'STACK' DW 32H DUP(0) SSEG ENDS ; Define data segment ; ------------------- DSEG SEGMENT 'DATA' COUNT EQU 05 DATA1 DW 20000,25000,30000,35000,40000 ORG 20H SUM DW 2 DUP(?) DSEG ENDS ; Define code segment

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

; 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

سوال ؟