assembly 如何找到常见的位模式?

vlju58qv  于 2023-08-06  发布在  其他
关注(0)|答案(1)|浏览(96)

我根据这些要求写了一个小程序:Write a program using bit flags that takes three different values and finds the bits they all have in common. Return the number that has all those bits in common.flag bit是您分配给位的名称。例如,在.equ KNOWS_MATHS, 0b1中,LSB被命名为KNOWS_MATHS。下面是我的代码:

.data
    .equ KNOWS_MATHS, 0b1
    .equ KNOWS_PHYSICS, 0b10
    .equ KNOWS_CHEMISTRY, 0b100
numbers:
    .quad 1, 3, 7 # 3 = 11b, 7 = 111b
results:
    .quad 0, 0, 0 
    
.text
.global main
main:
    movq %rsp, %rbp #for correct debugging
# check if first num knows maths
    leaq numbers, %rbx
    movq (%rbx), %rax
    andq $KNOWS_MATHS, %rax
    jnz knowsmaths
flag2:  
    movq (%rbx), %rax  
    andq $KNOWS_PHYSICS, %rax
    jnz knowsphysics
flag3:  
    movq (%rbx), %rax  
    andq $KNOWS_CHEMISTRY, %rax
    jnz knowschemistry
    
    jmp number02
knowsmaths:
    incq results
    jmp flag2
knowsphysics:
    incq results
    jmp flag3
knowschemistry:
    incq results
    
number02:
    leaq results, %rdx
    leaq numbers, %rbx
    movq 8(%rbx), %rax
    andq $KNOWS_MATHS, %rax
    jnz knowsmaths02
flag4:    
    movq 8(%rbx), %rax
    andq $KNOWS_PHYSICS, %rax
    jnz knowsphysics02
flag5:   
    movq 8(%rbx), %rax 
    andq $KNOWS_CHEMISTRY, %rax
    jnz knowschemistry02
    jmp number03
knowsmaths02:
    incq 8(%rdx)
    jmp flag4
knowsphysics02:
    incq 8(%rdx)
    jmp flag5
knowschemistry02:
    incq 8(%rdx)
    
number03:
    leaq results, %rdx
    leaq numbers, %rbx
    movq 16(%rbx), %rax
    andq $KNOWS_MATHS, %rax
    jnz knowsmaths03
flag6:    
    movq 16(%rbx), %rax
    andq $KNOWS_PHYSICS, %rax
    jnz knowsphysics03
flag7:   
    movq 16(%rbx), %rax 
    andq $KNOWS_CHEMISTRY, %rax
    jnz knowschemistry03
    jmp finish
knowsmaths03:
    incq 16(%rdx)
    jmp flag6
knowsphysics03:
    incq 16(%rdx)
    jmp flag7
knowschemistry03:
    incq 16(%rdx)
    
finish:

    movq $results, %rbx
    movq (%rbx), %r8
    movq 8(%rbx), %r9
    movq 16(%rbx), %r10
    movq $60, %rax
    syscall

字符串
我想知道是否应该返回number 1,因为它具有最常见的模式,或者number 7,因为它具有most位。我必须说我不明白的要求以及英语不是我的母语。

ktca8awb

ktca8awb1#

(我不习惯AT&T的语法,所以如果我打错了,请让我知道)
这里有一个我喜欢使用的方法,它使用了位移位。它根本没有优化,但这只是为了更容易地显示正在发生的事情。(如果我真的这样做,我会使用一个在用完位标志后终止的循环。)假设%rax包含学生参加的所有课程的位标志。

andq $7, %rax     ;chop off everything but our three subjects of interest
leaq results, %rbx

shrq 1, %rax
jnc .next  ;if carry is clear, that bit was a zero so skip this one
incq (%rbx)

.next:
shrq 1, %rax
jnc .next2
incq 8(%rbx)

.next2:
shrq 1, %rax
jnc .next3
incq 16(%rbx)

.next3:

字符串

相关问题