יום שישי, 4 במרץ 2011

חלק 6 - מדריך שפת אסמבלר \ אסמבלי \ מכונה

חלק 6 -
פתרון                                                                        
אתחול מצביעים;                                    mov bx,offset buf                                                            
                                                 mov di,offset buf1                                                                  
אתחול מונה;                                              mov cx,20H                                            
האם הבית הראשוןמאופס ? ;                         start: cmp byte ptr[bx],0                              
אם כן,דלג למילה הבאה;                                       je next                                                        
אם לא - פרוש;                                           [mov ax,[bx                                              
התו הנפרש רשום ב                                    ah ;       fill: mov [di],ah                                       
התקדם לבית הבא ביעד;                                         inc di                                                
עדכן מונה לולאה פנימית;                                      dec al                                              
בצע לולאה פנימית ע"פ al;             jnz fill                                                                                              
קדם מצביע;                                                   next: inc bx                                                                             
                                                             inc bx                                   
עדכן מונה לולאה חיצונית;                                     dec cx                                              
בצע לולאה חיצונית כנדרש;                                  jnz start                                                                                                 
3.6-שליפת או דחיפת מילה למערך ממוין                                             
נתון מערך מילים,buf,הממוין בסדר עולה.גודל המערך (במילים) רשום במשתנה num     
(מילה).במשתנה element (מילה),רשום מספר כלשהו.יש לכתוב קטע תכנית המבצע:       
1-אם אחת ממילות המערך,buf,מכילה את element,יש להוציאה מהמערך,buf,              
  ולצמצמו.מותר להניח ש buf יכול להכיל את element פעם אחת לכל היותר.          
2-אם אף אחת ממילותיו של buf לא מכילה את element,אזי יש להכניסו למערך,כך        
  שהמערך buf ימשיך להיות ממוין בסדר עולה.
פתרון                                                                        
אתחול מונה לולאה;                                            mov cx,num                                                         
הצבעתbuf ;   mov bx,offset buf                                                                                                           
            mov ax,element                               
האם המערך מכיל את                               ?element;     search:cmp [bx],ax                                           
אם כן,מחק אותו;                                            je delete                                                      
אם לא,הכניסול buf;                                         ja insert                                                       
המשך הבדיקה;                                                add bx,2                              
עדכון מונה לולאה וסיומה עם איפוסו;                            dec cx                                                                   
                                                          jnz search                    
element לא נמצא במערך,לכן הוא "מחובר" לסוף המערך;        mov [bx],ax                                               
עדכון אורך המערך;                                            inc num                                                     
קפיצה לסוף הקטע;                                             jmp sof                               
הגענו לכאן רק כאשר element נמצא במערך;                        delete:dec cx                                  
bx וdi מצביעים למילה שנמצאה ;                              mov di,bx                               
bx מצביע למילה הנמצאת מעל זו שנמצאה;                        add bx,2                          
"דריסת" המילה שנמצאה, ע"י המילה שמעליה;                  [again:mov ax,[bx                                                       
                                                         mov [di],ax                                            
עוברים למילה הבאה ;                                         add bx,2                                                                
                                                            add di,2                              
עדכון מונה לולאה וסיומה עם איפוסו ;                           dec cx                                                                  
                                                           jnz again                                                  
עדכון אורך המערך;                                            dec num                                                     
קפיצה לסוף הקטע;                                             jmp sof                      
הגענו לכאן רק כשיש לרשום את element בתוך המערך;            insert:mov di,bx                       
חישוב כתובתה של המילה שמעל המערך ;                         add cx,cx                                                               
                                                           add di,cx                              
bx מצביע על המילה האחרונה של המערך;                        mov bx,di                                                               
                                                            sub bx,2                                          
"פינוי מקום" ל element  ;        cont:mov ax,[bx]                                                                                       
                                                         mov [di],ax                                                               
                                                            sub bx,2                                                                
              sub di,2                                                       
                                                              sub cx,2                                                             
ִ                                                           jnz cont                                                  
הכנסת             mov ax,element                     ;                  element                                                          
            mov [di],ax                                                                                                           
עדכון אורך המערך;                                              inc num                                                                                         
                                                                     :sof                                                                                     
הוראות loope (loopz) ,loop ו loopne (loopnz)                                  

תחביר:loope target,loop target  ו loopne target                               

loop היא הוראת לולאה אוטומטית.האוגר cx משמש כמונה מספר מחזורי הלולאה.לפני     

תחילת הלולאה יש לאתחלו כנדרש.בכל מחזור לולאה,מוקטן ב 1 המספר הרשום ב cx.      

בהתאפס ,cx הלולאה מסתימת.                                                      

הערה:אם cx יאופס לפני תחילת הלולאה,תתבצע הלולאה k64 פעמים.                    

הערה:הוראות הלולאה (loope,loop ו loopne) אינן משפיעות על הדגלים.                                                                                           

 

loope היא הוראת לולאה אוטומטית מותנית.האוגר cx משמש כמונה מספר מחזורי         

הלולאה.לפני תחילת הלולאה יש לאתחלו כנדרש.בכל מחזור לולאה,מוקטן ב 1 המספר      

הרשום ב cx.הלולאה תמשך כל עוד הביטוי:cx = cx-1) and (zf == 1)),מחזיר true.
                                                                                               


loopne היא הוראת לולאה אוטומטית מותנית.האוגר cx משמש כמונה מספר מחזורי        

הלולאה.לפני תחילת הלולאה יש לאתחלו כנדרש.בכל מחזור לולאה,מוקטן ב 1 המספר      

הרשום ב cx. הלולאה תמשך כל עוד הביטוי:(cx = cx-1) and (zf == 0), מחזיר true.                                                                                                

 

הוראות לוגיות                                                                 

א- תחביר:not op  הופך את סיביותיו של op.op הוא אוגר (למעט אוגרי סגמנט) או        

   משתנה בגודל בית byte)) או מילה (word).                                         

   דוגמאות:                              not word ptr[bx],not a_byte,not ax                                    

   הוראה זו אינה משפיעה על הדגלים.                                            

ב- תחביר:and op1,op2   מבצעת פעולת and בין כל זוג סיביות מקבילות של               

op1    ו op2.התוצאה נשמרת ב op1.                                                 

op1    ו op2 משמעותם זהה לאלה שבהוראת add וחלים עליהם אותם כללים.הוראה זו        

   מעדכנת רק 5 דגלי סטטוס.דגל af אינו מוגדר.                                     

   דוגמאות: יש להחליף,בדוגמאות של הוראת add,את המילה add ב and.               

ג- or op1,op2  מבצעת פעולת or בין כל זוג סיביות מקבילות של op1 ו op2.התוצאה       

   נשמרת ב op1.                                                                   

op1    ו op2 משמעותם זהה לאלה שבהוראת and וחלים עליהם אותם כללים.הוראה זו        

   מעדכנת רק 5 דגלי סטטוס.דגל af אינו מוגדר.                                     

   דוגמאות: יש להחליף,בדוגמאות של הוראת and,את המילה and ב or.                

ד-xor op1,op2   מבצעת פעולת xor בין כל זוג סיביות מקבילות של op1 ו op2.           

   התוצאה נשמרת ב op1.                                                           

op1    ו op2 משמעותם זהה לאלה שבהוראת and וחלים עליהם אותם כללים.הוראה זו        

   מעדכנת רק 5 דגלי סטטוס.דגל af אינו מוגדר.                                     

   דוגמאות: יש להחליף,בדוגמאות של הוראת and,את המילה and ב xor.               

ה- test op1,op2  מבצעת פעולת and בין כל זוג סיביות מקבילות של op1 ו op2.           

   התוצאה אינה נשמרת אולם 5 דגלי הסטטוס מתעדכנים.דגל af אינו מוגדר.              

   דוגמאות: יש להחליף,בדוגמאות של הוראת and,את המילה and ב test.                                                                                            
 

‏אין תגובות:

הוסף רשומת תגובה