2016-06-02 31 views
1

Kann mir jemand sagen, wie man eine boolesche Variable in Assembly TASM setzt? Ich habe im Internet gesucht und kann keine richtige Erklärung finden.Assembly - Wie setze ich eine boolesche Variable

Danke an jeden, der hilft.

+2

Boolean ist ein Ausdruck aus einer Hochsprache. true vs false ist nur ein einzelnes Bit oder ein Bitmuster oder eine Regel (wie in C Zero (ein Bündel von Nullen, 8, 16, 32 oder 64) ist ein falscher und nicht null (jeder bis zu allen 8 , 16, 32 oder 64 Bits abhängig) ist wahr). –

+0

Danke für die Antwort wilch. Ich verstehe immer noch nicht wirklich, wie man einen Boolean benutzt. Können Sie mir vielleicht ein einfaches Beispiel geben und es mir erklären? Vielen Dank. – KatomPower

+0

Verwenden Sie ['setcc'] (http://www.felixcloutier.com/x86/SETcc.html), um basierend auf einer Bedingung ein Byte auf 0 oder 1 zu setzen. Sie verwenden dosbox, nicht emu8086, so dass Sie die vielen nützlichen Anweisungen verwenden können. –

Antwort

0

@dwelch ist richtig, Boolesch ist ein High-Level-Konzept, aber Assembly lässt Sie Konstanten definieren, die Sie TRUE und FALSE nennen könnten, und Sie können sie in Ihrem Code verwenden. Als Programmierer können Sie Ihr eigenes Konzept von "boolean" erstellen.

Das nächste Beispielprogramm definiert TRUE und FALSE als Konstanten, sucht nach Ziffern in einer Zeichenfolge, wenn Ziffern gefunden werden, gibt TRUE zurück, gibt andernfalls FALSE zurück und zeigt abhängig vom "booleschen" Ergebnis die eine oder andere Nachricht an (gemacht mit EMU8086):

.model small 
.stack 100h 
.data 
    FALSE equ 0 
    TRUE equ 255 
    pass db 'simple pa55word',0 
    msj1 db 'Your password is OK$' 
    msj2 db 'Your password requires at least one digit$' 

.code 
    mov ax, @data 
    mov ds, ax 

;SEARCH FOR ANY DIGIT IN PASSWORD. 
    mov si, offset pass ;PARAMETER FOR SEARCH_DIGITS. 
    call search_digits ;RETURNS BX = TRUE OR FALSE. 

    cmp bx, TRUE  ;IF BX == TRUE... 
    je good   ;...JUMP TO "GOOD" (ELSE, CONTINUES). 

;THE PASSWORD HAS NO DIGITS. 
    mov ah, 9 
    mov dx, offset msj2 
    int 21h 
    jmp finale 

;THE PASSWORD CONTAINS AT LEAST ONE DIGIT.  
good: 
    mov ah, 9 
    mov dx, offset msj1 
    int 21h 

finale: 
    mov ax, 4c00h 
    int 21h 

;------------------------------------------      
;PROC TO SEARCH FOR ANY DIGIT IN STRING SI.     
;RETURN : BX = TRUE : DIGIT FOUND. 
;   BX = FALSE : NO DIGIT FOUND. 
;MODIFIED REGISTERS : AL, BX, SI. 

search_digits proc  
    mov bx, FALSE  ;NO DIGITS FOUND YET. 
repeat: 
    mov al, [ si ] 
    inc si 
    cmp al, 0   ;IF CHAR IS ZERO... 
    je done   ;STRING END REACHED. 
    cmp al, '0'  ;IF AL < '0'... 
    jb repeat   ;...REPEAT (IT'S NO DIGIT). 
    cmp al, '9'  ;IF AL > '9'... 
    ja repeat   ;...REPEAT (IT'S NO DIGIT). 
    mov bx, TRUE  ;DIGIT FOUND!!! 
done: 
    ret 
search_digits endp  
+1

Danke an alle, die mir geholfen haben. Ich verstehe Booleans jetzt viel besser. – KatomPower

+0

Sie haben gerade meinen Upvote verpasst, weil die Definition von * true * mit 'TRUE eq 255' nicht übereinstimmt, was nur für einen 8-bit Container und dann die tatsächliche Speicherung von * true * im 16-bit Register BX! –

1

im x86-64 und i386 SysV ABIs zum Beispiel Variablen von _Bool/bool Typ des C muss den Low-Byte des Registers sie auf 0 oder 1 in der Serie sind, nicht nur irgendein nicht -zero Wert, so können Sie sicher AND sie zusammen und so Zeug. Die Verwendung von setcc based on a condition ist normalerweise eine einfache Möglichkeit, dies zu tun.

Eine ähnliche Konvention ist sinnvoll, wenn Sie Ihren eigenen ABI rollen, außer in Fällen, in denen Sie nur einen Rückgabewert für Null oder Nicht-Null testen müssen. Dann gilt @ dwelchs Vorschlag: Vergeuden Sie keinen Befehl, der einen Wert boolisiert, wenn Sie das Ergebnis nur mit etwas testen können, das sich nicht interessiert, wo das Nicht-Null-Bit ist. Siehe https://stackoverflow.com/tags/x86/info.