1

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

5 回答 5

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
于 2011-01-01T19:01:00.873 回答
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:
于 2011-01-01T20:08:26.790 回答
0
cmp AH, FFh
jl has_zeros

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

于 2011-01-02T00:10:31.727 回答
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 压入堆栈,然后将它们弹出。

于 2011-01-02T03:38:11.877 回答
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
于 2012-05-27T13:58:44.683 回答