装配 - 如何设置布尔变量

时间:2016-06-02 13:04:36

标签: assembly boolean tasm dosbox

有人可以告诉我如何在Assembly TASM中设置布尔变量吗?我一直在互联网上寻找,但我找不到合适的解释。

感谢任何帮助过的人。

2 个答案:

答案 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