160 likes | 296 Views
Assembly For X86. Chapter 7 הסתעפויות, שימוש במחסנית. הפקודה jmp. הגרסה הפשוטה ביותר ניתן להפעיל על תוית או אוגר: מוגבל בטווח של -128 עד 127 lp1: …. jmp lp1 ….. jmp bx. פקודות הסתעפות מותנות. JZ,JE (z==0) JNZ,JNE (z!=0) JA – jump above (unsigned) JG – jump greater(signed)
E N D
Assembly For X86 Chapter 7 הסתעפויות, שימוש במחסנית
הפקודה jmp • הגרסה הפשוטה ביותר • ניתן להפעיל על תוית או אוגר: • מוגבל בטווח של -128 עד 127 lp1: …. jmp lp1 ….. jmp bx
פקודות הסתעפות מותנות • JZ,JE (z==0) • JNZ,JNE (z!=0) • JA – jump above (unsigned) • JG – jump greater(signed) • JAE/JAG – jump if >= • JB/JBE (unsigned) • JL/JLE (signed) • JCXZ – jump if CX == 0 • JC/JNC/JS/JNS/JZ/JNZ…..
המחסנית • מבנה נתונים זמין שעובד בשיטת LIFO • אוגרים: SS, SP, BP • משמשת להעברת פרמטרים לפונקציות • המעבד משתמש בה בביצוע פסיקה • ניתן להגדיר את גודלה כרצוננו, ברירת המחדל היא K1
Push push op ;reg/mem • סדר פעולות: sp=sp-2 ss:sp = op • אם האופרנד הוא 32 סיביות: sp=sp-4 ss:sp=op
Pop • pop op ;reg/mem • 16 bit: op=ss:sp sp=sp+2 • 32 bit: op=ss:sp sp=sp+4
פקודות נוספות • pusha – הכנסת האוגרים: AX, CX, DX, BX, SP+8, BP, SI, DI (לפי סדר זה) • popa – הוצאת האוגרים הנ"ל (בסדר הפוך ללא SP – כלומר מתעלמים מקיומו במחסנית) • pushad, popad – כנ"ל עבור האוגרים המורחבים • pushf, popf – הכנסת/הוצאת אוגר הדגלים • popef ,pushfd – כנ"ל עבור אוגר הדגלים המורחב
דוגמא: החלפת ערכים mov ax,10 mov bx,20 push ax push bx pop ax pop bx
שימוש במשתנים .data mem1 db 0 mem2 dw 1234 .code … pop ax pop mem1 push word ptr mem2 push [si]
Memcopy mov bx,arr1 mov cx,size lp1: mov dx,[bx] push dx add bx,2 loop lp1 mov bx,arr2 mov cx,size lp2: pop dx mov [bx],dx sub bx,2 loop lp2
שגרות • מבנה: <procname> PROC NEAR/FAR : ret <procname> ENDP • קריאה לשגרה: CALL <procname>
NEAR/FAR • NEAR - השגרה נמצאת באותו סגמנט ואז לפני הקריאה לשגרה מוכנס IP למחסנית • FAR – השגרה נמצאת בסגמנט אחר, לפני הקריאה מוכנס למחסנית CS ואחריו IP • ניתן לקרוא לשגרה ע"י אופרנד זיכרון(במקום שם) עבור אופרנד 16 סיביות – NEAR, עבור 32 סיביות - FAR
איזון המחסנית • שגרה שמשתמשת באוגרים, חייבת לשמור את ערכם במחסנית לפני השימוש ולשחזרם בסיום השגרה. • השחזור חייב להיות בסדר הפוך לשמירה • חוסר תיאום בין שמירת האוגרים ושחזורם יגרום לקריאת כתובת חזרה לא תקינה
Fact PROC NEAR push bp push cx mov bp,sp mov cx,[bp+6] ; the parameter of the function mov ax,1 mov currDeg,1 cmp cx,0 jz exit factloop: mul currDeg inc currDeg loop factloop exit: ;the return value stored in AX pop cx pop bp ret fact endp
יצירת פרוייקט ממספר קבצים • יש להגדיר את הפונקציות שרוצים לייצא: • PUBLIC procname • בקובץ שמשתמש בפונקציות יש להצהיר עליהן: • EXTRN procname:NEAR,proc2:FAR…
תהליך הקישור c:\> tasm file1 c:\> tasm file2 c:\> tasm file3 : c:\> tlink file1+file2+file3 c:\> file1.exe