【问题标题】:need to know how to use the decimal number not the hex需要知道如何使用十进制数而不是十六进制数
【发布时间】:2013-11-06 14:52:47
【问题描述】:

我正在尝试学习汇编语言。这是我尝试运行的第一个程序。我遇到的问题是 arr 正在被加载并且 instisd 它加载了 1,2 权利,但随后它将 12 作为 c 加载。然后当我添加它时,它会添加字母+数字并给出错误的答案。谢谢你的帮助。

org $10000

     clr.l     d0        ; i = 0, we use the .l since i takes part in .l calculation
     clr.l     d3        ; sum = 0 (temporarily sum lives in d3)
     move.w    n, d1     ; d1 = n

loop cmp.w     d1, d0
     bge       endloop   ; if (i >= n) goto endloop

     movea.l   #arr, a0  ; a0 = &arr[0]
     adda.l    d0, a0   
     adda.l    d0, a0    ; a0 = &arr[0] + 2 x i
     add.w     (a0), d3  ; d3 = d3 + arr[i]

     addq.w    #1, d0    ; i = i + 1
     bra       loop      ; repeat loop

endloop
     move.w    d3, sum   ; write the sum into memory


org $11000

arr        dc.w     1, 2, 12, 4, 21
n          dc.w     5
sum      dc.w     0

P.S 我明白十进制 12 是十六进制 C 我真的需要知道如何使用十进制数而不是十六进制数

【问题讨论】:

  • 你用的是什么汇编程序?
  • “给出错误答案”是什么意思?十进制和十六进制是文本表示,在对数值进行算术运算时没有相关性。
  • 这是错误的,因为它正在添加十六进制,我需要它来添加十进制
  • 没有区别。数字完全相同。仅当您以文本形式查看数字时,基数才重要。
  • "好吧,那么为什么当我运行它时我得到 1+2+12=5"。如果我在 n 设置为 3(添加 1、2 和 12)的情况下运行它,我会得到 D3 = 0x0000000F,即 15,这是正确的结果。

标签: assembly motorola 68000


【解决方案1】:

我用easy68k测试了你的程序,它运行正常。

在用汇编语言处理数字时,请记住处理器只理解二进制算术。为了程序员的方便,汇编软件处理十六进制,但最终二进制算术是唯一重要的。

话虽如此,easy68k 将以十六进制而不是二进制或十进制显示值,因为十六进制是紧凑的,但是每当您在内存单元中看到一个值时,您必须放弃它的第一次查找并解释它。

例如:在您的情况下,在 D3 中有一个无符号整数,以十六进制显示。它是 C,它是十进制 12 的十六进制值(记住:9=>9、10=>A、11=>B、12=>C、13=>D、14=>E、15=>F)。

在其他情况下,您可能会处理 2 补数,这将完全不同。

或者浮点数,另一种野兽。

相同的值,不同的含义。我们如何选择正确的解释?

嗯,这取决于上下文:取决于您要编写的程序,您将知道如何解释数据。

顺便说一句,我不得不稍微修改一下你的代码,这是我的:

    org $400

arr:     dc.w     1, 2, 12, 4, 21
n:     dc.w     5
sum:     dc.w     0


    org $1800

START:
    clr.l     d0        ; i = 0, we use the .l since i takes part in .l calculation
    clr.l     d3        ; sum = 0 (temporarily sum lives in d3)
    move.w    n, d1     ; d1 = n

loop:   cmp.w     d1, d0
    bge       endloop   ; if (i >= n) goto endloop

    movea.l   #arr, a0  ; a0 = &arr[0]
    adda.l    d0, a0   
    adda.l    d0, a0    ; a0 = &arr[0] + 2 x i
    add.w     (a0), d3  ; d3 = d3 + arr[i]

    addq.w    #1, d0    ; i = i + 1
    bra       loop      ; repeat loop

endloop:    move.w    d3, sum   ; write the sum into memory

    END START

粘贴链接:http://pastebin.com/Ae0CgFrt

希望对你有帮助,

史努比

【讨论】:

    猜你喜欢
    • 2018-01-19
    • 2013-03-31
    • 1970-01-01
    • 2016-06-18
    • 2013-06-10
    • 2019-03-02
    • 2020-02-09
    • 2015-01-21
    相关资源
    最近更新 更多