240 likes | 447 Views
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
E N D
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 • mov ds,ax • mov ah,9 • mov dx,offset message • int 21h • mov ax,4C00h • int 21h • main endp • end main
Directives • title – כותרת הקובץ • .model – הגדרת מודל הזיכרון • .stack – מקטע המחסנית • .data – מקטע הנתונים • .code – מקטע הקוד • proc – שגרה • endp – סיום שגרה • end – סיום התוכנית
הרצת התוכנית • editor hello.asm • compiler tasm hello (hello.obj) • Linker tlink hello (hello.exe) • loader(dos) hello • ניתן להשתמש בקבצים נוספים בתהליך: • lib • lst
הגדרת משתנים • a DB ? • b DB ‘hello’ • c DB 100 • d DB Ah • e DB 11001100b • a1 DW ? • a2 DW 3000 • b1 DD ? • b2 DQ ?
דוגמא-פקודות אריתמטיות • ADC – חיבור עם התחשבות בדגל הנשא .DATA X DB 80h Y DB 20h .CODE …. mov DX,3090h add DL,x adc DH,y
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 • עבור 16 סיביות: mov DI,1000h mov word ptr [DI],5678h או בשורה אחת mov word ptr[1000h],5678h
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
סידרת פיבונאצ'י .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
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
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
פעולות על סיביות • 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 al,3 • הזזת 3 סיביות ימינה דרך CF • סיבית 0 זזה ל- CF , CF זז לסיבית 7 וכו' • RCL dl,4 • הזזת 4 סיביות שמאלה דרך CF
פניה לכתובות בזיכרון .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
יצירת היסט עם תוית 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
קביעת סגמנט • mov ax,ds:[si+7] • ניתן גם לא לקבוע סגמנט ואז: • אם בתוך הסוגריים משתמשים ב- BP יבחר SS • אם בסוגריים יש תוית אזי יבחר הסגמנט של התוית • אם בסוגריים נמצא BX יבחר DS • אסור לרשום mov dl,[2] • אבל מותר: mov dl,DS:[2]
הגדרת 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 • .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
קבועים • .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 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
מערכים • הגדרת מערך בשם arr בגודל 10 מאותחל ב-1 • arr DW 10 dup(1) • גישה לאבר החמישי: • mov ax,[arr+10] • mov si,10 • mov ax,arr[si]
LEA-Load Effective Address • ניתן לכתוב: • mov bx,offset string[3] • אך אסור להשתמש באוגרים: • mov bx,offset string[si+3] • כיוון שפענוח הכתובת נעשה בזמן הידור ולא בזמן ריצה. • הפתרון: • lea bx,string[3+si]
LDS • lds bx,1000h • הפקודה טוענת 32 סיביות מהזיכרון ככתובת המורכבת ממקטע והיסט. • ההיסט נטען לאוגר bx, המקטע לאוגר ds • אם משתמשים בשם משתנה הוא חייב להיות מוגדר DD (4 בתים) • קיימות גם פקודות LES, LSS, LFS, LGS