【问题标题】:Displaying hexadecimal contents in assembly language用汇编语言显示十六进制内容
【发布时间】:2012-01-08 07:26:42
【问题描述】:

大家好,我不确定我是否以正确的方式进行这一切。我需要斐波那契数列的前 12 个数字来计算我已经很确定它在做什么。但是现在我需要使用 dumpMem 在我的程序中显示 (Fibonacci) 的十六进制内容。我需要打印出:01 01 02 03 05 08 0D 15 22 37 59 90

但我只得到:01 01 00 00 00 00 00 00 00 00 00 00

非常感谢任何提示或帮助。

 INCLUDE Irvine32.inc
.data

reg DWORD -1,1,0                    ; Initializes a DOUBLEWORD array, giving it the values of -1, 1, and 0
array DWORD 48 DUP(?)
Fibonacci BYTE 1, 1, 10 DUP (?) 



.code
main PROC
       mov array, 1
       mov esi,OFFSET array ; or should this be Fibonacci?
       mov ecx,12
       add esi, 4


    L1:
        mov edx, [reg]
        mov ebx, [reg+4]
        mov [reg+8], edx
        add [reg+8], ebx                    ; Adds the value of the EBX and 'temp(8)' together and stores it as temp(8) 
        mov eax, [reg+8]                    ; Moves the value of 'temp(8)' into the EAX register        
        mov [esi], eax                      ; Moves the value of EAX into the offset of array
        mov [reg], ebx                      ; Moves the value of the EBX register to 'temp(0)' 
        mov [reg+4], eax                    ; Moves the value of the EAX register to 'temp(4)
        add esi, 4

       ; call DumpRegs
        call WriteInt
        loop L1

        ;mov ebx, offset array
        ;mov ecx, 12

        ;L2: 
        ;mov eax, [esi]
        ;add esi, 4
        ;call WriteInt
        ;loop L2

  ;Below will show hexadecimal contents of string target-----------------
   mov   esi, OFFSET Fibonacci      ; offset the variables
   mov   ebx,1                      ; byte format
   mov   ecx, SIZEOF Fibonacci      ; counter
   call  dumpMem 


exit
main ENDP

END main

【问题讨论】:

  • 你有没有写过任何尝试进行十六进制转换的东西?您显示的代码似乎纯粹与计算斐波那契数列有关,根本与十六进制转换无关。我怀疑有人会非常努力地帮助完成明显的家庭作业,直到/除非您自己尝试一些尝试并就您在其中遇到的问题提出具体问题。
  • @JerryCoffin dumpMem 负责将字节转换为十六进制,您需要做的就是传递正确的偏移量和长度。
  • @JerryCoffin:计算斐波那契数列。我现在需要显示偏移量的十六进制内容,这是我遇到问题的地方。 ;)

标签: loops assembly masm fibonacci irvine32


【解决方案1】:

在我看来,这里的问题在于计算斐波那契数列。你的代码让我有点……困惑。你有一堆“东西”,似乎与计算斐波那契数无关(例如,reg),以及其他可能的东西,但似乎你并不真正知道你想要做什么和他们一起。

看着你的循环来计算序列,我首先想到的是你正在使用大量的内存很多。编写汇编语言时首要(也是最重要的)事情之一就是最大限度地使用寄存器并最大限度地减少内存使用。

作为一个提示,我认为如果你在计算序列的过程中从记忆中读取任何东西,你可能会犯错误。您应该能够在寄存器中进行所有计算,因此唯一的内存引用将是写入结果。由于您(显然)只生成字节大小的结果,因此您应该只需要一个具有适当字节数的数组来保存结果(即,每个要生成的数字一个字节)。

我很想写一个小程序来展示它可以如何巧妙地适应汇编语言,但我想我可能不应该这样做......

【讨论】:

  • 感谢您的回复。这对我来说都是非常新的,我已经可以告诉你我非常讨厌汇编语言。这是我课程中的必修课,但后来被合并到另一个班级,现在我们整个学期只写两个汇编程序。我只是想像每个人一样度过这个难关,即使是cs部门的负责人也同意我永远不需要知道,也永远不会使用汇编语言。
  • @TMan:我不会这么轻易地放弃汇编语言。即使你最终没有写任何东西(可能,但不像你的导师暗示的那样确定),阅读它以进行调试的能力甚至对于从不写任何东西的人来说也非常有用。跨度>
【解决方案2】:

您对 dumpMem 的调用是正确的,但您的程序未将计算结果存储在正确的位置:您调用“斐波那契”的区域仍然初始化为 1、1 和 10 个零。您需要确保您的循环从 Fibonacci 的偏移量加 2 开始写入,并以一个字节为增量移动十次(十次,而不是十二次,因为您在初始化程序中提供了两个初始项)。

对不起,我不能再具体了,因为任何包含“斐波那契”一词的问题都不可避免地会成为某人的作业:-)

【讨论】:

  • 无论如何你可以举一个例子说明我没有正确存储结果。感谢您的回复。
  • 类似这样的东西:mov Fibonacci, 1 mov esi,OFFSET Fibonacci+2 mov ecx,10 add esi, 4
猜你喜欢
  • 2020-07-21
  • 1970-01-01
  • 2012-11-07
  • 2019-05-16
  • 1970-01-01
  • 2014-03-24
  • 2018-07-21
  • 1970-01-01
  • 2021-11-08
相关资源
最近更新 更多