News:

MASM32 SDK Description, downloads and other helpful links
MASM32.com New Forum Link
masmforum WebSite

What is this instruction do?

Started by etow, February 17, 2008, 09:44:03 PM

Previous topic - Next topic

etow

What does this instruction mean?

test    al, 00000100B

MichaelW

#1
The TEST instruction works like the AND instruction, except it only updates the flags, and does not store the result in the destination. So your example instruction would effectively test bit 2 of AL, clearing the zero flag if the bit is set and setting the zero flag if the bit is clear. You could use it something like this:

test al, 00000100b
jz  bit2clear
; code to execute when bit 2 is set (1)
...
bit2clear:
; code to execute when bit 2 is clear (0)


This app demonstrates how TEST works, and how it is different from AND:

; «««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««
    include \masm32\include\masm32rt.inc
; «««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««
    .data
    .code
; «««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««

; ---------------------------------------------------------
; This proc converts the specified dword to a binary string
; and stores the result in the specified buffer.
; ---------------------------------------------------------

dw2bin proc dwNumber:DWORD, pszString:DWORD
    push ebx
    mov eax, dwNumber
    mov ebx, pszString
    sub ebx, 1
    mov ecx, 8
  @@: 
    REPEAT 4
      add ebx, 1
      xor edx, edx
      shl eax, 1
      adc edx, '0'
      mov [ebx], dl
    ENDM
    mov BYTE PTR [ebx+1], 32
    add ebx, 1
    sub ecx, 1
    jnz @B
    mov BYTE PTR [ebx], 0
    pop ebx
    ret
dw2bin endp

; ------------------------------------------
; And this macro provides an easy interface.
; ------------------------------------------

bin$ MACRO DDvalue
  LOCAL rvstring
  .data
    rvstring db 40 dup (0)
  align 4
  .code
  invoke dw2bin, DDvalue, ADDR rvstring
  EXITM <OFFSET rvstring>
ENDM

; «««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««

; ----------------------------------------------------------
; This proc displays the value of the Overflow, Direction,
; Interrupt Enable, Sign, Zero, Auxiliary Carry, Parity, and
; Carry flags, in a DEBUG-style format.
;
;   Flag          position  flag set flag clear
;   ----          --------  -------- ----------
; Overflow        (bit 11)     OV        NV
; Direction       (bit 10)     DN        UP
; Interrupt       (bit 9)      EI        DI
; Sign            (bit 7)      NG        PL
; Zero            (bit 6)      ZR        NZ
; Auxiliary Carry (bit 4)      AC        NA
; Parity          (bit 2)      PE        PO
; Carry           (bit 0)      CY        NC
; ----------------------------------------------------------

dumpflags proc
    pushfd
    pushad
    pushf
    pop   bx
    .IF bx & 1 SHL 11         ; Overflow (bit 11)
      print "OV "
    .ELSE
      print "NV "
    .ENDIF
    .IF bx & 1 SHL 10         ; Direction (bit 10)
      print "DN "
    .ELSE
      print "UP "
    .ENDIF
    .IF bx & 1 SHL 9          ; Interrupt (bit 9)
      print "EI "
    .ELSE
      print "DI "
    .ENDIF
    .IF bx & 1 SHL 7          ; Sign (bit 7)
      print "NG "
    .ELSE
      print "PL "
    .ENDIF
    .IF bx & 1 SHL 6          ; Zero (bit 6)
      print "ZR "
    .ELSE
      print "NZ "
    .ENDIF
    .IF bx & 1 SHL 4          ; Auxiliary Carry (bit 4)
      print "AC "
    .ELSE
      print "NA "
    .ENDIF
    .IF bx & 1 SHL 2          ; Parity (bit 2)
      print "PE "
    .ELSE
      print "PO "
    .ENDIF
    .IF bx & 1 SHL 0          ; Carry (bit 0)
      print "CY ",13,10
    .ELSE
      print "NC ",13,10
    .ENDIF
    popad
    popfd
    ret
dumpflags endp

; «««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««
start:
; «««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««
    mov ebx, 1
    print bin$(ebx),13,10
    test bl, 00000100B
    call dumpflags
    print bin$(ebx),13,10
    mov ebx, 0ffffffffh
    print bin$(ebx),13,10
    test bl, 00000100B
    call dumpflags
    print bin$(ebx),13,10,13,10

    mov ebx, 1
    print bin$(ebx),13,10
    and bl, 00000100B
    call dumpflags
    print bin$(ebx),13,10
    mov ebx, 0ffffffffh
    print bin$(ebx),13,10
    and bl, 00000100B
    call dumpflags
    print bin$(ebx),13,10,13,10

    inkey "Press any key to exit..."
    exit
; «««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««
end start


0000 0000 0000 0000 0000 0000 0000 0001
NV UP EI PL ZR NA PE NC
0000 0000 0000 0000 0000 0000 0000 0001
1111 1111 1111 1111 1111 1111 1111 1111
NV UP EI PL NZ NA PO NC
1111 1111 1111 1111 1111 1111 1111 1111

0000 0000 0000 0000 0000 0000 0000 0001
NV UP EI PL ZR NA PE NC
0000 0000 0000 0000 0000 0000 0000 0000
1111 1111 1111 1111 1111 1111 1111 1111
NV UP EI PL NZ NA PO NC
1111 1111 1111 1111 1111 1111 0000 0100

eschew obfuscation