我根据这些要求写了一个小程序: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
位。我必须说我不明白的要求以及英语不是我的母语。
1条答案
按热度按时间ktca8awb1#
(我不习惯AT&T的语法,所以如果我打错了,请让我知道)
这里有一个我喜欢使用的方法,它使用了位移位。它根本没有优化,但这只是为了更容易地显示正在发生的事情。(如果我真的这样做,我会使用一个在用完位标志后终止的循环。)假设
%rax
包含学生参加的所有课程的位标志。字符串