我有一些数字 啊,al,bl和bh 寄存器。我需要检查至少有一个0位 每个 登记处 高鼻子 数字。如果有的话,然后放入变量 查看 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

正确的方法是:

.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

其他提示

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

如果您真的想找到第一个0位,则可以使用多个班次进行操作。或者,您可以使用BSF指令(假设80386组件),尽管您需要否定操作数并搜索第一组位。

最后,如果您不能使用BSF,则可以替代使用多个班次。我觉得 有点tw缩骇客 有一个例子。它将在C中,但是转换为组装不应该太难。

编辑您的信息之后:

因此,您想看看每个寄存器的上部nibble是否包含至少一个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
cmp AH, FFh
jl has_zeros

看来它对我有用,但是我假设一半是您的意思是上层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,然后将其弹出。

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

编辑 最后,我了解您想要什么: 结果应为-10,如果至少一个在其高鼻子中具有0xF:

    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:
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top