扫描第一个零位(汇编)?

时间:2011-01-01 18:53:59

标签: assembly x86-16

我在 AH,AL,BL和BH 寄存器中有一些数字。 我需要检查数字的高半字节每个寄存器中是否至少有一个0位。 如果有,则将其放入名为 check 10的变量中,否则输入-10。

这是我试过的:

org 100h
check dw 0
mov ah, 11011111b
mov al, 11011111b
mov bl, 11011111b
mov bh, 11011111b 

mov check, 10
and ax, 0F0F0h
cmp ax, 0F0F0h
je no_all_zeros
and bx, 0F0F0h
cmp bx, 0F0F0h
jne has_zeros
no_all_zeros:
mov check, -10
has_zeros:

ret

5 个答案:

答案 0 :(得分:4)

如果您只需要查看AH中是否有0位,则与0xFF进行比较。如果比较不相等,则至少有一个0位。与其他寄存器相同。

如果你真的想找到第一个0位,你可以用多个班次来做。或者您可以使用BSF指令(假设80386汇编),但您需要取消操作数并搜索第一个设置位。

最后,如果您不能使用BSF,还可以使用多班次。我认为Bit Twiddling Hacks有一个例子。它将在C中,但转换到装配不应该太难。

在您的信息后编辑:

所以你想看看每个寄存器的高半字节是否包含至少一个0位?而且您不想更改包含值的寄存器。

mov cx, ax
and cx, 0xF0F0 ; this clears the low nibbles so you don't have to worry about them
xor cx, 0xF0F0 ; CX will be non-zero if there were bits set in the high nibbles
jz NoZeros
; Here you'll need to check CH and CL individually to see if they're both non-zero

答案 1 :(得分:0)

    mov check, 10
    and ax, bx
    and ax, F0F0h
    cmp ax, F0F0h
    jne has_zeros
    mov check, -10
has_zeros:

编辑最后我理解你想要的东西:如果至少有一个在高半字节中有一个0xF,结果应为-10:

    mov check, -10
    xor  ax, F0F0h
    test ax, F000h
    je   no_zero
    test ax, 00F0h
    je   no_zero
    xor  bx, F0F0h
    test bx, F000h
    je   no_zero
    test bx, 00F0h
    je   no_zero
    mov check, 10
no_zero:

答案 2 :(得分:0)

cmp AH, FFh
jl has_zeros

看起来它对我有用,但我假设左半部分是指高8位。 可能是错的。

答案 3 :(得分:0)

  

只有在所有的时候才应该给10   寄存器中的数字至少有   左半部分为零位

这应该有效:

    mov [check], -10

    add al,0x10
    mov al,0
    adc ax,0x1000
    adc al,0
    add bl,0x10
    adc al,0
    add bh,0x10
    adc al,0
                      ;al = number of high nibbles that had all bits set

    test al,al        ;Did any high nibble have all bits set?
    jne .l1           ; yes, check = -10
    mov [check], 10   ; no, check = 10
.l1:

编辑:如果你不想替换寄存器中的值,那么在堆栈上按下ax和bx然后弹出它们。

答案 4 :(得分:0)

正确的方法是:

.MODEL SMALL
.STACK 100h

.DATA
check DB 10
.CODE
mov ax, @DATA
mov ds, ax
xor ax, ax
xor bx, bx
xor cx, cx

; Assign values   
mov cl, 4 ; Assign rotator - 4 bits
mov ax, 1011101010111010b
mov bx, 1110100010110100b

; Check AX
xor ax, 0F0F0h ; masking
shr ah, cl ; rotating and expecting other than 0
cmp ah, 0 ; ah = 0 ?
je noZero
shr al, cl
cmp al, 0
je noZero
xor bx, 0F0F0h
shr bh, cl
cmp bh, 0
je noZero
shr bl, cl
cmp bl, 0
je noZero
jmp exit
noZero:
mov check, -10
exit:
mov ah, 4ch
int 21h
相关问题