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