edited by
10,914 views
44 votes
44 votes

Consider a new instruction named branch-on-bit-set (mnemonic bbs). The instruction “bbs reg, pos, label” jumps to label if bit in position pos of register operand reg is one. A register is $32$ -bits wide and the bits are numbered $0$ to $31,$  bit in position $0$ being the least significant. Consider the following emulation of this instruction on a processor that does not have bbs implemented.

$temp\leftarrow reg \& mask$

Branch to label if temp is non-zero. The variable temp is a temporary register. For correct emulation, the variable  mask must be generated by

  1. $ mask\leftarrow \text{0x1} << pos$
  2. $ mask\leftarrow \text{0xffffffff} << pos$
  3. $ mask\leftarrow pos $
  4. $ mask\leftarrow \text{0xf}$
edited by

5 Answers

Best answer
50 votes
50 votes
  1. $mask\leftarrow \text{0x1} << pos$

We want to check for a particular bit position say $2$ (third from right). Let the number be $0xA2A7$ (last $4$ bits being $0111$). Here, the bit at position $2$ from right is $1$. So, we have to AND this with $0x0004$ as any other flag would give wrong value (may count other bits or discard the bit at position "$pos$"). And $0x0004$ is obtained by $0x1 << 2$ (by shifting $1$ "$pos$" times to the left we get a flag with $1$ being set only for the "$pos$" bit position).

edited by
21 votes
21 votes

This question can be simply frame into bit manipulation question.

We can say that "find the bit is set or not at position "pos" in given register "reg".

So finding the bit is set or not simply we need to perform an "AND" operation with '1' of that bit if result is 0 then bit is not set and if result is not 0 then bit is set. Now if given "pos" is not 0 then we need to left shift 1 by pos ( 0x1 << pos ).

9 votes
9 votes
here, bbs reg ,pos, label is given instruction , suppose i m taking position =2 in pos register ,

 

then, "bbs , reg, pos,label" will take branch when 2nd bit of binary pattern stored in register is 1.

but how to check 2nd bit of 32 bit binary pattern in register reg is 1 or not ?

 

for that we will perform an operation

reg : ..........0......11 (32 bit operand in binary pattern)

mask: 000........0010(32 bit binary pattern in which 2nd bit is 1)

if AND operation is done b/w reg and mask and 2nd bit of result is 1 and all are 0's then branch is taken otherwise brach is not taken

now , question is asking about which one instruction is used to generate mask.

mask <----- 0x1 i.e. (0001)<<(left shift by given position) POS

after shifting 0010 will be stored in mask (32 bit register ) for that option (a) is correct option
2 votes
2 votes
bbs reg pos label

$Eg: bbs|r_{0}|3| 2000$

$r_{0}=FCH$

$r_{0}:1111\underline{1}100\ (pos=3)$

$if\ 3^{rd}\ bit: 0\ PC=Sequence\ address$

$if\ 3^{rd}\ bit: 1\ PC=2000$


$temp\leftarrow reg\&mask$

$let's\ Test:$

$1)$

$mask: 00001000$

$r_{0}:\ \ \ \ \ \ \underline{11111100}\ (pos=3)$

$temp:\  00001000\ (08H)$ 

$Analysis:$

$In\ pos=3\ we\ got\ 1 // condition\ true$

$In\ temp\ we\ got\ non-zero\ result // condition\ true$

$2)$

$mask: 00001000$

$r_{0}:\ \ \ \ \ \ \underline{11110110}\ (pos=3)$

$temp:\  00000000\ (00H)$ 

$Analysis:$

$In\ pos=3\ we\ got\ 0 // condition\ false$

$In\ temp\ we\ got\ zero\ result // condition\ false$

$3)$

$mask: 01101101$

$r_{0}:\ \ \ \ \ \ \underline{11110110}\ (pos=3)$

$temp:\  01100100\ (64H)$ 

$Analysis:$

$In\ pos=3\ we\ got\ 0 // condition\ false$

$In\ temp\ we\ got\ non-zero\ result // condition\ true$


Now go through Options

$d)\ mask\leftarrow 0xf: Multiple\ 1's\ in\ mask\ \times$

$c)\ mask\leftarrow pos: Multiple\ 1's\ in\ mask\ \times$

$like\ pos=3(11), pos=5(101)$

$b)\ mask\leftarrow 0xffffffff>>pos: Multiple\ 1's\ in\ mask\ \times$

$a)\ mask\leftarrow 0x1<<pos:\checkmark$

$mask\leftarrow 00000001<<3$

$mask\leftarrow 00001000$

Variable mask must be generated by option $a)$ for correct emulation

Answer:

Related questions