以汇编语言显示十六进制内容

时间:2011-11-28 21:29:14

标签: loops assembly masm fibonacci irvine32

嘿伙计们,我不确定我是否正确地采取了这一切措施。我需要前12个Fibonacci序列来计算它已经做了哪些我已经很确定了。但现在我需要使用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

2 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:2)

在我看来,这里的问题是计算Fibonacci序列。你的代码让我有点......困惑。那里有一堆“东西”,似乎与计算Fibonacci数字无关(例如reg),有些可能,但看起来你真的不知道你在尝试什么和他们一起做。

看着你的循环计算序列,实际上跳出来的第一件事就是你正在使用内存 lot 。编写汇编语言时,最重要的(也是最重要的)事情之一就是最大限度地利用寄存器并最大限度地减少对内存的使用。

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

我很想写一个小例程,说明这可以很好地适应汇编语言,但我想我可能不应该这样做......