Θ. Ζαχαριάδης Αν. Καθηγητής Λ. Σαράκης Καθ. Εφαρμογών
Στον debugger που χρησιμοποιούμε στο εργαστήριο, όταν γράφουμε δεκαεξαδικούς αριθμούς που το πιο σημαντικό ψηφίο τους είναι Α-F βάζουμε μπροστά από τον αριθμό το 0. Αλλιώς εμφανίζεται μήνυμα μ λάθους. Να βάζετε στο πρόγραμμα σας που και που εντολές NOP (δεν έχουν καμία επίδραση στην εκτέλεση του κώδικα) ώστε σε περίπτωση που θέλετε να προσθέσετε ή να αλλάξετε εντολές να μη χρειάζεται να ξαναγράφετε όλες τις εντολές από εκεί που προσθέσατε/αλλάξατε και κάτω.
NOP No operands No Operation. Algorithm: Do nothing Example: MOVBX65 BX,65 NOP NOP NOP MOV AX, 7
ADD REG, memory Add. memory, REG REG, REG memory, immediate REG, immediate Algorithm: operand1 = operand1 + operand2 Example: MOV AL, 5 ; AL = 5 ADD AL, -3 ; AL = 2
Αριθμός των 16bits που βρίσκεται στις θέσεις μνήμης (στο τμήμα δεδομένων) 00 και 01 (πιο σημαντικό byte στη θέση 1), να προστεθεί στον αριθμό 16bits που βρίσκεται στις θέσεις μνήμης 02 και 03 (πιο σημαντικό byte στη θέση 3) και το αποτέλεσμα (χωρίς το πιθανό κρατούμενο) να αποθηκευθεί στις θέσεις μνήμης 04 & 05 (πιο σημαντικό byte στη θέση 5). Να παρατηρηθεί η σημαία κρατουμένου μετά την πράξη της πρόσθεσης. Παρατηρείστε ότι οι σημαίες δεν αλλάζουν μετά την εκτέλεση της εντολής mov. Mov ax, [0000] Mov bx, [0002] Add ax,bx Mov [0004], ax
Μέχρι τώρα έχουμε δει 2 τρόπους για αναφορά στη μνήμη Άμεση immediate: Τα δεδομένα παρέχονται άμεσα από την εντολή και μπορεί να είναι των 8 ή 16 bit. Mov ax, 568 Απ ευθείας direct: Το 16-bit offset της διεύθυνσης παρέχεται άμεσα από την εντολή Mov ax, [1000H] Ένας πρόσθετος τρόπος αναφοράς στη μνήμη είναι ο παρακάτω: Έμμεση με τη χρήση καταχωρητή - Register indirect: Tο 16-bit offset βρίσκεται σε κάποιον καταχωρητή βάσης ή δείκτη ο οποίος δηλώνεται ρητά στην εντολή. Συνήθως θα χρησιμοποιούμε τον καταχωρητή βάσης BX Mov ds:[bx], 800h ; DS:[BX] <- 00H, DS:[BX+1] <- 08H Mov cx, ds:[bx]
INC REG Increment. memory Algorithm: operand = operand + 1 Example: MOV AL, 4 INC AL ; AL = 5 Except for the carry flag, inc sets the flags the same way as add operand, 1 would
DEC REG Decrement. memory Algorithm: operand = operand - 1 Example: MOV AL, 255 ; AL = 0FFh (255 or -1) DEC AL ; AL = 0FEh (254 or -2)
Να γραφτεί το προηγούμενο ο Πρόγραμμα 1 χρησιμοποιώντας ο αναφορά στη μνήμη «έμμεση μέσω καταχωρητή». Πχ. να θεωρήσετε ότι ο καταχωρητής BX κρατάει το offset της διεύθυνσης που θέλετε να προσπελάσετε στο τμήμα δεδομένων (DS: data segment). Mov bx, 0 Mov ax, ds:[bx] Inc bx Inc bx Mov cx, ds:[bx] Add ax,cx Inc bx Inc bx Mov ds:[bx], ax
ADC REG, memory Add with Carry. memory, REG REG, REG memory, immediate REG, immediate Algorithm: operand1 = operand1 + operand2 + CF Example: STC ; set CF = 1 ; Alternatively, other set of instructions can be used to set the CF MOV AL, 5 ; AL = 5 ADC AL, 1 ; AL = 7
Προσαρμόστε το Πρόγραμμα 1 ώστε το κρατούμενο (0 ή 1) πού προκύπτει από την πρόσθεση των 2 αριθμών των 16bits να αποθηκεύεται στη θέση μνήμης 06 και ο αριθμός στις θέσεις μνήμης 04 και 05. Mov ax, [0000] Mov bx,,[0002] Add ax,bx ; Το κρατούμενο αποθηκεύεται στο Carry flag Mov [0004], ax ; Αποθήκευση του αριθμού στις θέσεις 4 & 5 Mov cx,0 ; Προετοιμασία ώστε ο cx (μπορεί εναλλακτικά να χρησιμοποιηθεί ο cl ή ch) να πάρει την τιμή του κρατουμένου Adc cx,0 ; Πρόσθεση μόνο του κρατουμένου στον cx Mov [06],cl ; Αποθήκευση κρατουμένου στη θέση μνήμης 6
Να προστεθούν 2 αριθμοί των 32bits που βρίσκονται στις θέσεις μνήμης 0-3 (πιο σημαντικό byte στη θέση 3 και λιγότερο σημαντικό στη θέση 0) και 4-7( (πιο σημαντικό byte στη θέση 7 και λιγότερο σημαντικό στη θέση 4) και το αποτέλεσμα να αποθηκευτεί στις θέσεις μνήμης 8-12. Στη θέση 12 να αποθηκευτεί το κρατούμενο και ο υπόλοιπος αριθμός στις θέσεις 8-11 (πιο σημαντικό byte στη θέση 11 και λιγότερο σημαντικό στη θέση 8). Mov ax, [0000] ; ax = [01][00] Mov bx, [0004] ; bx = [05][04] Add ax,bx ; Το κρατούμενο αποθηκεύεται στο Carry flag Mov [0008], ax ; Αποθήκευση του αριθμού στις θέσεις 8& 9 Mov ax, [0002] ; ax = [03][02] Mov bx, [0006] ; bx = [07][06] Adc ax,bx ; Πρόσθεση και παλαιού κρατουμένου - Το νέο κρατούμενο αποθηκεύεται στο Carry flag Mov [000Α], ax ; Αποθήκευση του αριθμού στις θέσεις 10 & 11 Mov cl,0 ; Προετοιμασία ώστε ο cl να πάρει την τιμή του κρατουμένου Adc cl,0 ; Πρόσθεση μόνο του κρατουμένου στον cl Mov [000C],cl ; Αποθήκευση κρατουμένου στη θέση μνήμης 12
SUB REG, memory Subtract. t memory, REG REG, REG Algorithm: memory, immediate REG, immediate operand1 = operand1 - operand2 Example: Sub al, 14H
Να γραφτεί πρόγραμμα που να αφαιρεί τον αριθμό 5 από τις θέσεις μνήμης 0,1,2,3 Mov al,[0] Sub al, 5 Mov [0],al Mov al,[1] Sub al, 5 Mov [1],al Mov al,[2] Sub al, 5 Mov [2],al Mov al,[3] Sub al, 5 Mov [3],al
Να γραφτεί πρόγραμμα που να αφαιρεί διαδοχικα τους αριθμούς 21,27,47,32 από τις θέσεις μνήμης 0,1,2,3 (στις θέσεις βάζω το 32). Mov al,[0] Sub al, 21 Mov [0],al Mov al,[1] Sub al, 27 Mov [1],al Mov al,[2] Sub al, 47 Mov [2],al Mov al,[3] Sub al, 32 Mov [3],al
Το προηγούμενο Πρόγραμμα 5 χρησιμοποιώντας λιγότερες εντολές μεταφοράς από και προς τη μνήμη: Mov ax,[0] Sub al, 5 Sub ah, 5 Mov [0],ax Mov ax,[2] Sub al, 5 Sub ah, 5 Mov [2],ax
XCHG REG, memory memory, REG REG, REG Exchange values of two operands. Algorithm: operand1 < - > operand2 Example: p Xchg bx,ax
Ανταλλάξτε τα περιεχόμενα των θέσεων μνήμης 0 & 1 με τα περιεχόμενα των θέσεων μνήμης 2 & 3. Mov ax, [0] Xchg [2], ax Mov [0],ax
Εύρεση τετραγώνου ενός αριθμού με χρήση πίνακα. Υποθέστε ότι τα τετράγωνα των αριθμών 0 4 είναι αποθηκευμένα στις θέσεις μνήμης ds:0010 ds:0014 (με αντίστοιχες τιμές 0, 1, 4, 9, 16d). Να βρεθεί το τετράγωνο του αριθμού που είναι αποθηκευμένος στη θέση μνήμης ds:0000 και να αποθηκευθεί στη θέση μνήμης ds:0001. Υπόδειξη: Να χρησιμοποιηθεί σαν δείκτης ο καταχωρητής BX Mov bl, [0] ; Φόρτωμα του καταχωρητή με τον αριθμό Mov bh, 0 ; Μηδενισμός για να φτιαχτεί η τιμή του BX Add bx, 10 ; Δημιουργία κατάλληλου offset Mov ax, ds:[bx] Mov [1], al