Сканирование на первый нулевой бит (сборка)? - PullRequest
1 голос
/ 01 января 2011

У меня есть несколько цифр в 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

Ответы [ 5 ]

4 голосов
/ 01 января 2011

Если вам просто нужно посмотреть, есть ли в 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
0 голосов
/ 27 мая 2012

Правильный способ сделать это будет:

.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
0 голосов
/ 02 января 2011

должен давать 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:

Редактировать: Если вы не хотите заменять значения в регистрах, то нажмите на топор и bx в стеке и потом вытолкните их.

0 голосов
/ 02 января 2011
cmp AH, FFh
jl has_zeros

Похоже, это будет работать для меня, но я предполагаю, что в левой половине вы имеете в виду старшие 8 бит.Может быть неправильно, хотя.

0 голосов
/ 01 января 2011
    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:
...