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.
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.
@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
Danke an alle, die mir geholfen haben. Ich verstehe Booleans jetzt viel besser. – KatomPower
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! –
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.
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). –
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
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. –