1 / 24

Assembly For X86

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

lynch
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. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Assembly For X86 Chapter 6 כתיבת תוכניות מלאות

  2. 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

  3. Directives • title – כותרת הקובץ • .model – הגדרת מודל הזיכרון • .stack – מקטע המחסנית • .data – מקטע הנתונים • .code – מקטע הקוד • proc – שגרה • endp – סיום שגרה • end – סיום התוכנית

  4. הרצת התוכנית • editor  hello.asm • compiler  tasm hello (hello.obj) • Linker  tlink hello (hello.exe) • loader(dos)  hello • ניתן להשתמש בקבצים נוספים בתהליך: • lib • lst

  5. הגדרת משתנים • a DB ? • b DB ‘hello’ • c DB 100 • d DB Ah • e DB 11001100b • a1 DW ? • a2 DW 3000 • b1 DD ? • b2 DQ ?

  6. דוגמא-פקודות אריתמטיות • ADC – חיבור עם התחשבות בדגל הנשא .DATA X DB 80h Y DB 20h .CODE …. mov DX,3090h add DL,x adc DH,y

  7. 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

  8. Word Ptr • עבור 16 סיביות: mov DI,1000h mov word ptr [DI],5678h או בשורה אחת mov word ptr[1000h],5678h

  9. 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

  10. סידרת פיבונאצ'י .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

  11. 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

  12. 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

  13. פעולות על סיביות • 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

  14. RCR,RCL • RCR al,3 • הזזת 3 סיביות ימינה דרך CF • סיבית 0 זזה ל- CF , CF זז לסיבית 7 וכו' • RCL dl,4 • הזזת 4 סיביות שמאלה דרך CF

  15. פניה לכתובות בזיכרון .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

  16. יצירת היסט עם תוית 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

  17. קביעת סגמנט • mov ax,ds:[si+7] • ניתן גם לא לקבוע סגמנט ואז: • אם בתוך הסוגריים משתמשים ב- BP יבחר SS • אם בסוגריים יש תוית אזי יבחר הסגמנט של התוית • אם בסוגריים נמצא BX יבחר DS • אסור לרשום mov dl,[2] • אבל מותר: mov dl,DS:[2]

  18. הגדרת 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

  19. חיבור 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

  20. קבועים • .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

  21. 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

  22. מערכים • הגדרת מערך בשם arr בגודל 10 מאותחל ב-1 • arr DW 10 dup(1) • גישה לאבר החמישי: • mov ax,[arr+10] • mov si,10 • mov ax,arr[si]

  23. LEA-Load Effective Address • ניתן לכתוב: • mov bx,offset string[3] • אך אסור להשתמש באוגרים: • mov bx,offset string[si+3] • כיוון שפענוח הכתובת נעשה בזמן הידור ולא בזמן ריצה. • הפתרון: • lea bx,string[3+si]

  24. LDS • lds bx,1000h • הפקודה טוענת 32 סיביות מהזיכרון ככתובת המורכבת ממקטע והיסט. • ההיסט נטען לאוגר bx, המקטע לאוגר ds • אם משתמשים בשם משתנה הוא חייב להיות מוגדר DD (4 בתים) • קיימות גם פקודות LES, LSS, LFS, LGS

More Related