====== Logik, Sprünge und Sprungmarken ======
Der Befehlssatz des Prozessors enthält die Befehle AND, OR, XOR, TEST und NOT der booleschen Logik. D
Das Format für diese Befehle ist folgendes:
^ Anweisung ^ Format im Programmcode ^
|AND |AND operand1, operand2 |
|OR |OR operand1, operand2 |
|XOR |XOR operand1, operand2 |
|TEST |TEST operand1, operand2 |
|NOT | NOT operand1 |
Der erste Operand kann entweder in einem Register oder im Speicher sein. Der zweite Operand kann entweder in einem Register/Speicher oder ein unmittelbarer (konstanter) Wert sein. Speicher-zu-Speicher-Operationen sind nicht möglich.
Die Operatoren werden bitweise ausgeführt je nach Ergebis werden die Flags CF, OF, PF, SF oder ZF gesetzt.
===== Die AND-Instruktion =====
Die AND-Anweisung vergleicht zwei Operanden indem sie eine bitweise AND-Operation durchführt. Die bitweise UND-Verknüpfung ergibt 1, wenn die übereinstimmenden Bits beider Operanden 1 sind, andernfalls ergibt sie 0.
Das Ergebnis der Operation wird im ersten Operand gespeichert.
Beispiel:
Operand1: 1010 0101
Operand2: 1000 0011
----------------------------------
AND -> Operand1: 1000 0001
Die AND-Verknüpfung kann verwendet werden, um ein oder mehrere Bits zu löschen. Beispiel: Das BL-Register enthält 0011 1010. Wenn du die höherwertigen Bits auf Null setzen willst, verknüpfe BL mit 0FH:
mov BL, 00111010B; Schreibe 00111010 ins Register BL
and BL, 0FH ; Jetzt steht in BL das Bitmuster 00001010
----
{{:aufgabe.png?nolink |}}
=== (A1) ===
Analysiere den folgenden Code. Welchen Inhalt hat das Register BL nach der AND Operation? Welche Ausgabe erzeugt das Programm?
section .data
tabelle TIMES 10 DW 97
section .text
global _start ;must be declared for linker (ld)
_start: ;tell linker entry point
MOV BL, 01111010B ;
AND BL, 0F0H ;
MOV [tabelle], BL ; Was passiert hier?
;tabelle ausgeben
mov edx,20 ;message length
mov ecx,tabelle ;message to write
mov ebx,1 ;file descriptor (stdout)
mov eax,4 ;system call number (sys_write)
int 0x80 ;call kernel
mov eax,1 ;system call number (sys_exit)
int 0x80 ;call kernel
----
{{:aufgabe.png?nolink |}}
=== (A2) ===
An folgendem Beispiel kann man sich einige neue Möglichkeiten erschließen - das folgende Programm testet eine Zahl, ob sie gerade oder ungerade ist.
section .data
even_msg db 'Gerade Zahl!'
len1 equ $ - even_msg
odd_msg db 'Ungerade Zahl!'
len2 equ $ - odd_msg
section .text
global _start
_start: ;tell linker entry point
mov ax, 8h ;getting 8 in the ax
and ax, 1 ;and ax with 1
jz evnn
mov eax, 4 ;system call number (sys_write)
mov ebx, 1 ;file descriptor (stdout)
mov ecx, odd_msg ;message to write
mov edx, len2 ;length of message
int 0x80 ;call kernel
jmp exitprog
evnn:
mov ah, 09h
mov eax, 4 ;system call number (sys_write)
mov ebx, 1 ;file descriptor (stdout)
mov ecx, even_msg ;message to write
mov edx, len1 ;length of message
int 0x80 ;call kernel
exitprog:
mov eax,1 ;system call number (sys_exit)
int 0x80 ;call kernel
* Teste das Programm und überprüfe, ob es korrekte Ausgaben erzeugt.
* Erweitere das Programm um eine Benutzereingabe, die ein Zeichen als Eingabe akzeptiert. Wie kannst du Zahlen testen die größer sind als 10?
----
{{:aufgabe.png?nolink |}}
=== (A3) ===
Bearbeite die Seite https://www.tutorialspoint.com/assembly_programming/assembly_logical_instructions.htm, um Informationen über die weiteren logischen Operatoren zu erhalten.
Informationen zu Bedingungen und Sprungbefehlen findest du auf dieser Seite:
https://www.tutorialspoint.com/assembly_programming/assembly_conditions.htm