Assembly for x86
This presentation is the property of its rightful owner.
Sponsored Links
1 / 24

Assembly For X86 PowerPoint PPT Presentation


  • 80 Views
  • Uploaded on
  • Presentation posted in: General

Assembly For X86. Chapter 6 כתיבת תוכניות מלאות. Example 1. The Hello World Program. title Hello World Program         (hello.asm) ; This program displays “Hello, world!” .model small .stack 100h .data message db “Hello, world!”,0dh,0ah,’$’ .code main proc     mov  ax,@data

Download Presentation

Assembly For X86

An Image/Link below is provided (as is) to download presentation

Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author.While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server.


- - - - - - - - - - - - - - - - - - - - - - - - - - E N D - - - - - - - - - - - - - - - - - - - - - - - - - -

Presentation Transcript


Assembly for x86

Assembly For X86

Chapter 6

כתיבת תוכניות מלאות


Assembly for x86

  • Example 1. The Hello World Program.

  • title Hello World Program         (hello.asm)

  • ; This program displays “Hello, world!”

  • .model small

  • .stack 100h

  • .data

  • message db “Hello, world!”,0dh,0ah,’$’

  • .code

  • main proc

  •     mov  ax,@data

  •     mov  ds,ax

  •     mov  ah,9

  •     mov  dx,offset message

  •     int  21h

  •     mov  ax,4C00h

  •     int  21h

  • main endp

  • end main


Directives

Directives

  • title – כותרת הקובץ

  • .model – הגדרת מודל הזיכרון

  • .stack – מקטע המחסנית

  • .data – מקטע הנתונים

  • .code – מקטע הקוד

  • proc – שגרה

  • endp – סיום שגרה

  • end – סיום התוכנית


Assembly for x86

הרצת התוכנית

  • editor  hello.asm

  • compiler  tasm hello (hello.obj)

  • Linker  tlink hello (hello.exe)

  • loader(dos)  hello

  • ניתן להשתמש בקבצים נוספים בתהליך:

    • lib

    • lst


Assembly for x86

הגדרת משתנים

  • a DB ?

  • b DB ‘hello’

  • c DB 100

  • d DB Ah

  • e DB 11001100b

  • a1 DW ?

  • a2 DW 3000

  • b1 DD ?

  • b2 DQ ?


Assembly for x86

דוגמא-פקודות אריתמטיות

  • ADC – חיבור עם התחשבות בדגל הנשא

    .DATA

    X DB 80h

    Y DB 20h

    .CODE

    ….

    mov DX,3090h

    add DL,x

    adc DH,y


Byte ptr

Byte Ptr

  • הצבת הערך 17 בכתובת 1000:

    mov dl,17h

    mov bx,1000h

    mov [bx],dl

    ניתן לרשום זאת גם כך:

    mov bx,1000

    mov byte ptr [bx],17h

    ניתן גם לכתוב זאת בשורה אחת:

    mov byte ptr[1000h],17h


Word ptr

Word Ptr

  • עבור 16 סיביות:

    mov DI,1000h

    mov word ptr [DI],5678h

    או בשורה אחת

    mov word ptr[1000h],5678h


Sbb sub with borrow

SBB – Sub With Borrow

  • SBB op1,op2

  • הפקודה מחסירה את op2 מ- op1 ובנוסף מחסירה את הערך שנמצא ב – CF

    .DATA

    X DD 70903798h

    Y DD 50976549h

    .CODE

    mov ax,word ptr x

    mov dx,word ptr x+2

    sub ax,word ptr y

    Sbb dx,word ptr y+2


Assembly for x86

  • סידרת פיבונאצ'י

    .MODEL SMALL

    .STACK 100h

    .DATA

    num db 5

    res dw ?

    .CODE

    mov ax,@DATA

    mov ds,ax

    mov cx, word ptr num

    mov ax,1

    mov bx,ax ;fib0=fib1=1


Assembly for x86

fib:

mov dx,ax

add dx,bx

mov bx,ax

mov ax,dx

dec cx

cmp cx,0

jnz fib

mov res,dx

mov ah,4ch

int 21h

END


Assembly for x86

XCHG

  • title Exchange Two Variables 

  • .model small

  • .stack 100h

  • .data

  • value1 db 0Ah

  • value2 db 14h

  • .code

  • main proc

  •     mov  ax,@data      ; initialize DS register

  •     mov  ds,ax

  •     mov  al,value1     ; load the AL register

  •     xchg value2,al     ; exchange AL and value2

  •     mov  value1,al     ; store AL back into value1

  •     mov  ax,4C00h      ; exit program

  •     int  21h

  • main endp

  • end main


Assembly for x86

פעולות על סיביות

  • AND op1,op2 ; op1 = op1 & op2

  • TEST op1,op2; flags op1 & op2

  • OR op1,op2

  • XOR op1,op2

  • NEG op1

  • SHR op1,num ;op1=op1>>num

  • SHL op1,num;CF הסיבית שיצאה נמצאת ב

  • ROR op1,num ;rotate right

  • ROL op1,num;rotate left


Rcr rcl

RCR,RCL

  • RCR al,3

  • הזזת 3 סיביות ימינה דרך CF

  • סיבית 0 זזה ל- CF , CF זז לסיבית 7 וכו'

  • RCL dl,4

  • הזזת 4 סיביות שמאלה דרך CF


Assembly for x86

פניה לכתובות בזיכרון

.DATA

x dw 6;x=0

y db 7;y=2

z dd 9;z=3

dw 88;z+4 or w-2

w dw 89;w=9


Assembly for x86

יצירת היסט עם תוית

var db 5

mov al,var

mov al,[var]

mov al,[bx+var]

mov al,[bx]+var

mov al,[bx+si+var+3]

mov al,var[bx][si]+3

var[bx]  [bx]+var  [bx+var]

var[bx][si]  [var+bx+si]  [bx+si]+var


Assembly for x86

קביעת סגמנט

  • mov ax,ds:[si+7]

  • ניתן גם לא לקבוע סגמנט ואז:

    • אם בתוך הסוגריים משתמשים ב- BP יבחר SS

    • אם בסוגריים יש תוית אזי יבחר הסגמנט של התוית

    • אם בסוגריים נמצא BX יבחר DS

    • אסור לרשום mov dl,[2]

    • אבל מותר: mov dl,DS:[2]


Offset

הגדרת offset

  • מציינת את ההיסט של הכתובת יחסית לסגמנט כלומר כתובת הנתון בתוך הסגמנט

    .data

    aList db 10h,20h,30h

    sum   db 0

    .code

    mov bx,offset aList   

    mov al,[bx]; AL = 10h

    inc bx

    add al,[bx]; AL = 30h

    inc bx

    add al,[bx]; AL = 60h

    mov si,offset sum; get offset of sum

    mov [si],al; store the sum


16 bit

חיבור 16 bit

  • .data

  • wordList dw 1000h,2000h,3000h

  • sum      dw 0

  • .code

  • mov bx,offset wordList

  • mov ax,[bx]; first number

  • add ax,[bx+2]; second number

  • add ax,[bx+4]; third number

  • mov [bx+6],ax; store the sum


Assembly for x86

קבועים

  • .data

  • string db "This is a string."

  • COUNT  = ($ – string)   

  • .code

  • mov   cx,COUNT

  • mov   si,offset string 

  • L1: 

  • mov   ah,2

  • mov   dl,[si]

  • int   21h

  • inc   si

  • loop  L1


16 bit1

16 Bit

  • .data

  • intarray dw 100h,200h,300h,400h

  • COUNT = ($ – intarray) / 2

  • .code

  • mov   ax,0

  • mov   di,offset intarray 

  • mov   cx,COUNT

  • L1: 

  • add   ax,[di]

  • add   di,2

  • loop  L1


Assembly for x86

מערכים

  • הגדרת מערך בשם arr בגודל 10 מאותחל ב-1

  • arr DW 10 dup(1)

  • גישה לאבר החמישי:

  • mov ax,[arr+10]

  • mov si,10

  • mov ax,arr[si]


Lea load effective address

LEA-Load Effective Address

  • ניתן לכתוב:

  • mov bx,offset string[3]

  • אך אסור להשתמש באוגרים:

  • mov bx,offset string[si+3]

  • כיוון שפענוח הכתובת נעשה בזמן הידור ולא בזמן ריצה.

  • הפתרון:

  • lea bx,string[3+si]


Assembly for x86

LDS

  • lds bx,1000h

  • הפקודה טוענת 32 סיביות מהזיכרון ככתובת המורכבת ממקטע והיסט.

  • ההיסט נטען לאוגר bx, המקטע לאוגר ds

  • אם משתמשים בשם משתנה הוא חייב להיות מוגדר DD (4 בתים)

  • קיימות גם פקודות LES, LSS, LFS, LGS


  • Login