420 likes | 636 Views
زبان ماشین و اسمبلی – درس ششم. شروع برنامه نویسی دانشگاه آزاد اسلامی واحد نیک شهر سعید آشیان. شروع برنامه سازی. stack. سه بخش اصلی هر برنامه Data Stack Code. data. code. Stacksg segment stack ‘stack’ Dw 32h dup(0) Stackseg ends.
E N D
زبان ماشین و اسمبلی – درس ششم شروع برنامه نویسی دانشگاه آزاد اسلامی واحد نیک شهر سعید آشیان
شروع برنامه سازی stack • سه بخش اصلی هر برنامه • Data • Stack • Code data code
Stacksg segment stack ‘stack’ Dw 32h dup(0) Stackseg ends Datasg segment ‘data’ Datasg ends data 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 start program
Stacksg segment stack ‘stack’ Dw 32h dup(0) Stackseg ends Datasg segment ‘data’ X db 10h Y dw 1234h Datasg ends Codesg segment ‘code’ Assume ss:stacksg,ds:datasg , cs:codesg Main proc far Mov ax,datasg Mov ds,ax ;----------------------------------------- Mov ax,x Mov bx,y Add ax,bx Mov x,ax ;------------------------------------------ Mov ax,4c00h Int 21h Main endp Codesg ends End main
تعریف انواع داده (DATA TYPE) VARNAME D VALUE(S) نام متغیر D مقدار (ها) X1 DB 100 1B 2B X2 DW 1200 4B X3 DD 434565 8B X4 DQ 457234572457 10B X5 DT 12312312342342
تعریف متغیر از نوع بایت X1 DB 0 X8 DB 10 DUP(100) X2 DB ? X9 DB 20 DUP (?) X3 DB 25H X10 DB ‘ABCDEDFG’ X2 DB 10,20,’A’,15,’COMPUTER’ X4 DB 0AFH X5 DB 01011110B X6 DB 15,100,200 X7 DB ‘A’,’B’,’C’,’D’
تعریف متغیر از نوع WORD X1 DW 0 X8 DW 10 DUP(100) X2 DW ? X9 DW 20 DUP (?) X3 DW 1225H X10 DW ‘AB’ X2 DW 10,20,’AC’,15 X4 DW 0A12FH X5 DW 01011110B X6 DW 15,100,200 X7 DW ‘A’,’B’,’C’,’D’
نحوه قرار گیری داده ها در حافظه 1000 1001 c5 1002 4f 1003 1004 …. 4F C5 WORD
تعریف متغیر از نوع DOUBLE ، QUAD ، TEN BYTE • مشابه با DW • فضای اشغال شده بیشتر 4-8-10 • نحوه قرار گیری در حافظه مشابه WORD • مثال : • X1 DD 43FAC254H 200 54 201 c2 202 fa … 43 43 FA C2 54
Stacksg segment stack ‘stack’ Dw 32h dup(0) Stackseg ends Datasg segment ‘data’ a db B dw 1000 C dd ? D dq dup (?) Y dt 1234h Datasg ends 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
دستورات محاسباتی • جمع • جمع به کمک بیت نقلی • تفریق • تفریق با بیت قرضی • گسترش بایت به کلمه • گسترش کلمه به LONG • ضرب • تقسیم • منفی کردن • کاهش • افزایش • جمع BCD • تفریق BCD • ...
جمع (ADD) PF ADD DEST,SRC OF CF DEST←DEST+SRC SF ZF AF
جمع (ADD) ADD AX, BX AX ← AX+ BX ADD AX, M AX ← AX+ M CORRECT M ← M+ AX ADD M,AX ADD CX,0FC25H CX ← CX+ 0FC25H ADD M,N ERROR ADD AL,CX
جمع با بیت نقلی (ADC) PF ADC DEST,SRC OF CF DEST←DEST+SRC+ CF SF ZF AF
تفریق (SUB) PF SUB DEST,SRC OF CF DEST←DEST-SRC SF ZF AF
تفریق به کمک بیت قرضی (SBB) PF SBB DEST,SRC OF CF DEST←DEST-(SRC+CF) SF ZF AF
گسترش BYTE به WORD بیت علامت 0 x x x x x x x 0 0 0 0 0 0 0 0 0 x x x x x x x
گسترش byte به word بیت علامت 1 x x x x x x x 1 1 1 1 1 1 1 1 1 x x x x x x x
دستورات گسترش داده • CBWConvert Byte to Word • CWDConvert Word to Byte
ضرب ( MUL) BYTE * BYTE WORD DOUBLE MUL BYTE * WORD WORD * WORD DOUBLE
MUL BYTE * BYTE WORD MUL OPERAND AX ← OPERAND * AL
مثال MOV AL,100 MOV BL,200 MUL BL AX=200*100=20000 MOV AL,100 MUL 55 AX=55*100=5500 در ضرب بایت در بایت همیشه یکی از اپرند ها AL است
MUL WORD * WORD DOUBLE MUL OPERAND AX DX ← OPERAND * AX
مثال MOV AX,1000 MOV CX,5000 MUL CX (AX,DX) ← AX * CX DX AX 4C 4B40
MUL WORD * BYTE WORD * WORD DOUBLE CBW MOV AL,100 CBW MUL BX MOV AX,0064H MUL BX (DX,AX)←AX*BX
ضرب همیشه یکی از اپراند ها در AL یا AX قرار دارد • ضرب اعداد بی علامت (UNSIGNED) • ضرب علامتدار (SIGNED) MUL IMUL نتیجه محاسبات در AX یا در (DX,AX) قرار می گیرد
تقسیم DIVISION AX ÷ byte WORD ÷ BYTE DIV DOUBLE ÷ WORD (DX AX) ÷ word
DIV DIV OPERAND8 DIV OPERAND16 OPERAND8 OPERAND16 AX DX,AX AL AX AH DX
مثال MOV AX,102 MOV CL,5 DIV CL AL = AX / CL=20 AH= AX % CL = 2 (DX,AX)=40401200H AX= (DX,AX) / BX DX=(DX,AX) % BX MOV DX,4040H MOV AX,1200H MOV BX,500H DIV BX MOV AX, 1000 DIV 120 عملوند تقسیم نمی تواند عدد باشد ERROR
تمرین • برنامه ای بنویسید که مبلغ 25575 را به سکه های 1و5و10و25 تومانی خرد کند .
Stacksg segment stack ‘stack’ Dw 100h dup(0) Stackseg ends Datasg segment ‘data’ X dw 25575 c25 db ? c10 db ? c5 db ? c1 db ? Datasg ends
Codesg segment ‘code’ Assume ss:stacksg,ds:datasg , cs:codesg Main proc far Mov ax,datasg Mov ds,ax ;----------------------------------------- mov cl,25 Mov ax ,x Div cl Mov c25,al mov cl,10 Mov al ,ah Cbw Div cl Mov c10,al
Mov cl,5 Mov al,ah Cbw Div cl Mov c5,al Mov c1,ah ;------------------------------------------ Mov ax,4c00h Int 21h Main endp Codesg ends End main
تکلیف • برنامه ای بنویسید که نمرات 5 درس را از حافظه خوانده و معدل آن را محاسبه نماید • برنامه ای بنویسید که یک درجه حرارت را از سلسیوس به فارنهایت تبدیل نماید • برنامه ای بنویسید که روز ماه و سال تولد و تاریخ روز را از حافظه خوانده و تعداد روزهای زندگی را محاسبه نماید • برنامه ای بنویسید که تاریخ روز را خوانده و تعیین کند که امروز چند شنبه است • برنامه ای بنویسید که تاریخ شمسی را به میلادی تبدیل نماید (؟؟؟)
تقسیم • علامتدار • بی علامت همواره عملوند اول تقسیم در (DX,AX) یا AX قرار دارد idiv div خارج قسمت در AL یا AX قرار می گیرد و باقیمانده در AHیا DX قرار میگیرد
افزایش INCREAMENT INC OPERAND INC MEM INC X مثال INC REG8 INC AL INC REG16 INC CX INC REG32 INC EBX OF SF ZF AF PF CF
کاهش DECREAMENT DEC OPERAND DEC MEM DEC X مثال DEC REG8 DEC AL DEC REG16 DEC CX DEC REG32 DEC EBX OF SF ZF AF PF CF
قرینه کردنNEGATIVE NEG REG8 NEG CL NEG OPERAND مثال NEG REG16 NEG AX NEG REG32 NEG EBX NEG MEM NEG X قرینه کردن معادل با مکمل دو عدد است OF SF ZF AF PF CF
مثال • برنامه ای بنویسید که بدون استفاده از دستورالعمل ضرب دو متغیر X و Y را در هم ضرب کرده حاصل را در Z ذخیره نماید . • X و Y هشت بیتی و Z شانزده بیتی است . Int x=10,y=5,sum=0; For (i=x; i>0;i--) Sum+=y;
Stacksg segment stack ‘stack’ Dw 320h dup(0) Stackseg ends Datasg segment ‘data’ X db 10 Y db 5 Z dw 0 Datasg ends
Codesg segment ‘code’ Assume ss:stacksg,ds:datasg , cs:codesg Main proc far Mov ax,datasg Mov ds,ax ;------------------------------------------------------------ Mov al,0 Mov al,y Mov cx, x For : Add z, ax Loop for ;------------------------------------------------------------ Mov ax,4c00h Int 21h Main endp Codesg ends End main