有人可以告诉我如何在Assembly TASM中设置布尔变量吗?我一直在互联网上寻找,但我找不到合适的解释。
感谢任何帮助过的人。
答案 0 :(得分:1)
例如,在x86-64和i386 SysV ABIs中,C _Bool
/ bool
类型的变量必须将寄存器的低字节设置为0或1,而不是只是任何非零值,所以你可以安全地AND
他们在一起这样的东西。使用setcc
based on a condition通常是一种简单的方法。
当您滚动自己的ABI时,类似的约定是有意义的,除非您只需要测试零或非零的返回值。然后@dwelch的建议适用:如果你可以用一些不关心非零位的东西测试结果,不要浪费一个booleanize值的指令。请参阅https://stackoverflow.com/tags/x86/info。
答案 1 :(得分:0)
@dwelch是对的,boolean是一个高级概念,但汇编允许你定义你可能称之为TRUE和FALSE的常量,并且你可以在你的代码中使用它们。作为程序员,您可以创建自己的“布尔”概念。
下一个示例程序将TRUE和FALSE定义为常量,搜索字符串中的数字,如果找到数字,则返回TRUE,否则返回FALSE,并且,根据“boolean”结果,它显示一条或另一条消息(make与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