【问题标题】:Assembly - How To Set A Boolean Variable汇编 - 如何设置布尔变量
【发布时间】:2016-06-02 13:04:35
【问题描述】:

谁能告诉我如何在Assembly TASM 中设置布尔变量?我一直在网上找,找不到合适的解释。

感谢任何提供帮助的人。

【问题讨论】:

  • 布尔值是高级语言的一个术语。 true vs false 只是一个位或一个位模式或规则(如在 C 中,零(一堆零,8、16、32 或 64)是一个假且非零(任何一个到所有 8 , 16, 32 或 64 位取决于)是真的)。​​
  • 感谢您回答 dwelch。我仍然不太明白如何使用布尔值。你能给我一个简单的例子并向我解释一下吗?谢谢。
  • 使用setcc根据条件将字节设置为0或1。您使用的是 dosbox,而不是 emu8086,因此您可以使用许多有用的 386 指令。

标签: assembly boolean tasm dosbox


【解决方案1】:

@dwelch 是对的,布尔值是一个高级概念,但是汇编允许您定义可能称为 TRUE 和 FALSE 的常量,并且您可以在代码中使用它们。作为程序员,您可以创建自己的“布尔”概念。

下一个示例程序将 TRUE 和 FALSE 定义为常量,在字符串中搜索数字,如果找到数字,则返回 TRUE,否则返回 FALSE,并根据“布尔”结果显示一条消息或另一条消息(由与 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      

【讨论】:

  • 感谢大家帮助我。我现在对布尔值的理解好多了。
  • 你错过了我的投票,因为 true 的定义与 TRUE equ 255 之间的不匹配,它只是请求一个 8 位容器,然后是 true 在 16 位寄存器 BX 中!
【解决方案2】:

例如,在 x86-64 和 i386 SysV ABIs 中,C 的 _Bool / bool 类型的变量必须将它们所在寄存器的低字节设置为 0 或 1,而不仅仅是任何非零值,所以你可以安全地AND他们在一起和类似的东西。使用setcc based on a condition 通常是一种简单的方法。

当您推出自己的 ABI 时,类似的约定是有意义的,除非您只需要测试零或非零的返回值。然后@dwelch 的建议适用:如果您可以用不关心非零位在哪里的东西来测试结果,请不要浪费指令布尔化一个值。见https://stackoverflow.com/tags/x86/info

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-07-20
    • 1970-01-01
    • 1970-01-01
    • 2017-01-18
    • 1970-01-01
    • 2021-01-02
    • 1970-01-01
    相关资源
    最近更新 更多