【问题标题】:How would I output the number of odds and evens in register #0x40?如何在寄存器#0x40 中输出奇偶数?
【发布时间】:2021-04-19 00:56:37
【问题描述】:

不确定如何将#0x30 到#0x39 的内容初始化为#0x40 和#0x41。我知道我应该有 7 个偶数和 3 个赔率。我尝试制作一个 Loop2 将 R1(#0x30) 移动到 R5(#0x40),但我 不确定这是否正确,因为我觉得有一种更简单的方法可以将奇数和偶数实现到寄存器#0x40。另外,请不要在一开始就引用代码,因为那只是一些基准代码供我参考。不是在找人为我做这项工作,但一些提示或技巧会有所帮助,因为我对 8051 微控制器和汇编语言非常不熟悉。

 ; This code places some values into RAM at
    ; addresses 0x30 through 0x39:
    MOV R0, #0x30
    MOV R1, #0
    MOV R2, #10
    MOV R3, #0
    MOV A, #144
    MOV B, #253
    again:
    MUL AB
    ADD A,B
    DEC B
    MOV @R0,A
    ADD A,R2
    XRL B,#11011010b
    INC R0
    DJNZ R2, again
    CLR C

; Complete this program by writing code below
; that looks at the values in RAM at addresses 0x30 through 0x39,
; and determines the number of odd values and the number of even
; values.  Your code should store at address 0x40 the number 
; of even values found and at address 0x41 the number of odd 
; values found.
MOV R1, #0x30
MOV R2, #0
MOV R3, #0
MOV R4, #10
MOV R5, #0x40
MOV R6, #0x41
Loop:
MOV A,@R1
ANL A, #00000001b
INC R1
JZ even
INC R2
JMP after
even:
INC R3
after:
DJNZ R4,Loop

Loop2:;Not sure if this second loop is needed
; to output the number of evens and odds in #0x40 and #0x41 
MOV A,R1
MOV A,R5
DJNZ R4,Loop2 

【问题讨论】:

  • 您的奇数/偶数循环是有道理的。目前还不清楚你为什么要在最后一个循环。只需将R3 存储到0x40R20x41
  • 好的,我会这样做:MOV R3,@R5?
  • 逻辑上是的,但@R5 不是有效的寻址模式。你可以直接做MOV 0x40, R3
  • 谢谢我知道了!我不清楚我是否可以将值存储在文字寄存器中,但现在很有意义。

标签: assembly 8051


【解决方案1】:

您计算偶数和赔率的逻辑是合理的,但您可以改进代码以减少占用空间并加快执行速度。

  • 初始化数组的循环以指向 3Ah 的 R0 寄存器结束。您可以使用这个事实并从头到尾遍历数组。这将使您不必设置指针。
  • 您可以直接在内存中计数,而不是先在几个寄存器中计数,然后将它们存储到内存中。
  • JMP after 将使用 2 个周期,但您可以将其替换为仅使用 1 个周期的补偿 DEC 40h
                   ; R0 == #3Ah
  MOV  40h, #0     ; Number of evens
  MOV  41h, #0     ; Number of odds
  MOV  R2, #10
Loop:
  DEC  R0          ; Pre-decrement to work backwards
  MOV  A, @R0
  ANL  A, #00000001b
  JZ   even
odd:
  INC  41h
  DEC  40h
even:
  INC  40h
  DJNZ R2, Loop

更好

这是基于这样一个事实,即偶数和赔率之和必须为 10。

                   ; R0 == #3Ah
  MOV  40h, #0     ; Number of evens
  MOV  R2, #10
  MOV  41h, R2     ; Number of odds
Loop:
  DEC  R0          ; Pre-decrement to work backwards
  MOV  A, @R0
  ANL  A, #00000001b
  JNZ  odd
even:
  INC  40h
  DEC  41h
odd:
  DJNZ R2, Loop

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多