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

(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
 

(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

(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