Отображение шестнадцатеричного содержимого на ассемблере - PullRequest
0 голосов
/ 29 ноября 2011

Эй, ребята, я не уверен, правильно ли я поступлю. Мне нужны первые 12 чисел последовательности Фибоначчи, чтобы вычислить, что она делает, я почти уверен. Но теперь мне нужно отобразить шестнадцатеричное содержимое (Фибоначчи) в моей программе, используя dumpMem. Мне нужно получить распечатку: 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 ]

2 голосов
/ 29 ноября 2011

Мне кажется, что проблема здесь в вычислении последовательности Фибоначчи. Ваш код для этого оставляет меня несколько ... озадаченным. У вас есть куча «вещей», которые, кажется, не имеют ничего общего с вычислением чисел Фибоначчи (например, reg), и другие, которые могут, но кажется, что вы действительно не знаете, что пытаетесь сделать с ними.

Глядя на ваш цикл для вычисления последовательности, первое, что практически бросается в глаза, это то, что вы используете память лот . Одна из первых (и наиболее важных) вещей, когда вы пишете на ассемблере, - это максимальное использование регистров и минимизация использования памяти.

Как подсказка, я думаю, что если вы прочитаете что-нибудь из памяти в курсе, если вычисляете последовательность, вы, вероятно, делаете ошибку. Вы должны иметь возможность выполнять все вычисления в регистрах, поэтому единственными ссылками в памяти будут записи результатов. Поскольку вы (очевидно) производите только результаты размером в байты, вам нужен только один массив с соответствующим количеством байтов для хранения результатов (т. Е. Один байт на число, которое вы собираетесь сгенерировать).

Я испытываю желание написать небольшую подпрограмму, показывающую, как аккуратно это можно адаптировать к языку ассемблера, но я полагаю, что мне, вероятно, не следует этого делать ...

2 голосов
/ 29 ноября 2011

Ваш вызов dumpMem правильный, но ваша программа не хранит результаты ваших вычислений в правильном месте: регион, который вы называете "Фибоначчи", остается инициализированным 1, 1 и десятью нулями. Вам нужно убедиться, что ваш цикл начинает писать со смещением Фибоначчи плюс 2 и перемещается десять раз с однобайтовым шагом (десять, а не двенадцать, потому что вы указали два начальных элемента в инициализаторе).

Извините, я не могу быть более конкретным, поскольку любой вопрос, содержащий слово "Фибоначчи", неизбежно оказывается чьей-то домашней работой: -)

...