Assembly 扫描第一个零位(组件)?

Assembly 扫描第一个零位(组件)?,assembly,x86-16,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 an

我在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

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

如果你真的想找到第一个0位,你可以用多次移位。或者,您可以使用BSF指令假定80386汇编,尽管您需要对操作数求反并搜索第一个设置位

最后,如果不能使用BSF,还有一种替代方法可以使用多个班次。我认为政府有一个例子。它将使用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

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

如果你真的想找到第一个0位,你可以用多次移位。或者,您可以使用BSF指令假定80386汇编,尽管您需要对操作数求反并搜索第一个设置位

最后,如果不能使用BSF,还有一种替代方法可以使用多个班次。我认为政府有一个例子。它将使用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
最后编辑我了解您想要什么:如果至少有一个高半字节中有0xF,则结果应为-10:

最后编辑我了解您想要什么:如果至少有一个高半字节中有0xF,则结果应为-10:

看起来它对我有用,但我假设你的左半部指的是上面的8位。 但这可能是错误的

看起来它对我有用,但我假设你的左半部指的是上面的8位。 但这可能是错误的

只有在所有测试中,才应给出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,然后弹出它们

只有在所有测试中,才应给出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按到堆栈上,然后将其弹出。

正确的方法是:

.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

正确的方法是:

.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

假设8086是16位的,他想要左上半半个半字节,我想,他不需要和0xFF00,而不是0xFF吗?首先,我不想替换寄存器中的值,所以我认为应该测试它。另一点是,这是子寄存器。在8086中,它们是8位的。所以它应该是0xF0不考虑到我只需要扫描数字的左半部分-左4位?假设8086是16位,他想要左半部分的上半个半字节,我想,他不需要和0xFF00,而不是0xFF吗?首先,我不想替换寄存器中的值,所以我想应该进行测试。另一点是,这是子寄存器。在8086中,它们是8位的。所以它应该是0xF0否,考虑到我只需要扫描数字的左半部分-左4位?