📜  8085程序来查找累加器的设置位

📅  最后修改于: 2021-06-28 08:56:42             🧑  作者: Mango

问题–除一位外,累加器的所有位均为0,其中一位为1。使用8085编写汇编语言程序以确定累加器的哪一位为1。结果应为1到8的十进制数,并且必须为存储在寄存器C中。

例子 –

Example 1 : Accumulator Content is 10H (Hex)

Accumulator Content -> 0 0 0 1 0 0 0 0 
Result after execution -> Register C : 5 

Example 2 : Accumulator content is 02H (Hex)

Accumulator Content -> 0 0 0 0 0 0 1 0 
Result after execution -> Register C : 2

解决方案 –
该问题可以通过多种方法解决。在这里,讨论了两种方法:

  1. 不使用进位标志
  2. 使用进位标志

方法1:不使用进位标志

算法 –

  1. 以寄存器C的形式初始化计数器
  2. 用累加器将01的寄存器B加载到AND并检查设置位
  3. AND累加器的内容与寄存器B
  4. 如果AND运算的结果不为零,则获得最终结果
  5. 如果结果为零,则递增计数器C
  6. 累加器内容使用RRC右移而不会影响进位标志
  7. 再次搜索下一位

程序 –

程序起始地址-> 3000H

MEMORY ADDRESS MNEMONICS COMMENT
3000 LXI SP, 5000H Initialize Stack Pointer
3003 MVI C, 01H C <- 01H
3005 MVI B, 01H B <- 01H
3007 ANA B AND A with B
3008 JNZ 3010H Jump at Zero Flag reset (Z=1) to location 3010H
300B INR C C <- C+1
300C RRC Rotate accumulator right without Carry
300D JMP 3007H Unconditional jump to location 3007H
3010 HLT Halt Execution

解释 –

  1. LXI SP,5000H用于在较高的位置初始化堆栈指针,以使其与程序计数器不一致
  2. MVI C,01H存储计数器的值,该值将在执行结束时存储最终结果
  3. MVI B,01H将01H存储到寄存器B
  4. ANA B逻辑与寄存器B的内容与累加器的最右位检查设置位
  5. 如果“与”运算结果为非零值,则JNZ 3010H会跳转到“暂停”指令;这意味着该位被置位并获得最终结果
  6. 如果“与”运算结果为零,则INR C将使位计数器递增;否则,INR C将递增。暗示需要继续搜索设置位
  7. RRC用于在不影响进位标志的情况下使累加器右移
  8. JMP 3007H无条件跳转以检查累加器的下一位
  9. HLT停止执行程序流程

方法2:使用进位标志

算法 –

  1. 以寄存器C的形式初始化计数器
  2. 累加器内容通过进位标志右移
  3. 计数器增加
  4. 如果设置了进位标志(累加器的最右位),则获得最终结果
  5. 如果进位标志被复位(CY = 0),则对下一位继续迭代

程序 –

程序起始地址-> 3000H

MEMORY ADDRESS MNEMONICS COMMENT
3000 LXI SP, 5000H Initialize Stack Pointer
3003 MVI C, 00H C <- 00H
3005 RAR Rotate accumulator right through Carry
3006 INR C C <- C+1
3007 JNC 3005H Jump to location 3005H if CY=0
300A HLT Halt Execution

解释 –

  1. LXI SP,5000H用于在较高的位置初始化堆栈指针,以使其与程序计数器不一致
  2. MVI C,00H存储计数器的值,该值将在执行结束时存储最终结果
  3. RAR通过进位标志将累加器向右旋转,以便在指令进位标志包含累加器的最右位之后
  4. INR C递增计数器
  5. 如果未设置进位标志,则JNC 3005H跳转到位置3005H,即累加器的最右位为0。如果设置了进位标志,则JNC 3005H不执行
  6. HLT停止执行程序流程