题
我有一些数字 啊,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:
不隶属于 StackOverflow