2015-10-21 1 views
1

Je suis dans un cours de Machine Architecture et Assembly Language, et je suis supposé créer un programme MASM qui crée la séquence de Fibonacci jusqu'à un nombre défini par l'utilisateur, compris entre 1 et 46. Quand J'essaie de transférer la chaîne stockée dans un BYTE marqué buffer, qui est l'endroit où les auteurs du livre ReadString procédure stocke une chaîne à une autre BYTE marquée user, je reçois cette sortie de construction:Déplacement d'un BYTE vers un BYTE

1>------ Build started: Project: MASM2, Configuration: Debug Win32 ------ 
1> Assembling fibonacci.asm... 
1>fibonacci.asm(39): error A2070: invalid instruction operands 
1>C:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\V140\BuildCustomizations\masm.targets(50,5): error MSB3721: The command "ml.exe /c /nologo /Sg /Zi /Fo"Debug\fibonacci.obj" /Fl"MASM2.lst" /I "c:\Irvine" /W3 /errorReport:prompt /Tafibonacci.asm" exited with code 1. 
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ========== 

Je ne sais pas pourquoi je ne peut pas passer à des objets de même taille les uns dans les autres. J'ai commenté les parties de l'utilisateur et imprimé le tampon, et il stocke l'entrée comme une chaîne correctement. Toute aide est grandement appréciée.

*** Note: Nous utilisons le livre Assembly Language pour le processeur x86, 7th Ed. par Kip Irvine, et en utilisant sa bibliothèque Irvine32.

; Calculate Fibonacci to the nth degree 

INCLUDE Irvine32.inc 

.data 
buffer BYTE 21 DUP(0) 
welcome BYTE "Welcome to Fibonacci! My name is Zach, I will be your programmer today!", 0 
question BYTE "What is your name?: ", 0 
greet BYTE "Hello, ", 0 

user BYTE ? 

prompt BYTE "Enter a number from 1 to 46: ", 0 
debrief BYTE "GoodBye" 

input SDWORD ? 

fib DWORD ? 

.code 
main proc 

    call Clrscr 

    ;Print Welcome Screen 
    mov edx,OFFSET welcome 
    call WriteString 
    call Crlf 


    ;Get Username and Greet 
    mov edx,OFFSET question 
    call WriteString 
    call Crlf 

    mov edx,OFFSET buffer 
    mov ecx,SIZEOF buffer 
    call ReadString 
    mov user, buffer 

    mov edx,OFFSET greet 
    call WriteString 
    mov edx,OFFSET buffer 
    call WriteString 
    call Crlf 


    ;Get Input-- 1 to 46 

    mov edx,OFFSET prompt 
    call WriteString 

    call ReadInt 
    mov input,eax 


    ;Validate n 

    ;Calculate-5 terms per line w/5 spaces between 
    mov ecx,input 
    mov al, ',' 
    mov eax,1 
    call WriteDec 

    start: 
    call WriteChar 
    call WriteDec 
    mov fib, eax 
    add eax,fib 
    LOOP start 

    ;Debrief 
    call Crlf 
    mov edx,OFFSET debrief 
    call WriteString 
    invoke ExitProcess,0 
main endp 
end main 

Fun Nouvelle sortie:

1>------ Build started: Project: MASM2, Configuration: Debug Win32 ------ 
1> Assembling fibonacci.asm... 
1>fibonacci.asm(44): error A2022: instruction operands must be the same size 
1>fibonacci.asm(45): error A2022: instruction operands must be the same size 
1>C:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\V140\BuildCustomizations\masm.targets(50,5): error MSB3721: The command "ml.exe /c /nologo /Sg /Zi /Fo"Debug\fibonacci.obj" /Fl"MASM2.lst" /I "c:\Irvine" /W3 /errorReport:prompt /Tafibonacci.asm" exited with code 1. 
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ========== 
+0

Si ce qui précède est 'fibonacci.asm', l'erreur de compilation se réfère à'appel WriteString' et'appel Crlf' qui ne peut pas être le problème .. Qu'est-ce que sur les lignes 44 et 45? – Kenney

+0

Je disposais d'un en-tête et de quelques lignes de débogage lorsque je publiais la sortie, et les supprimais pour l'affichage du code, j'ai corrigé la section de sortie – zgangwer20

+1

À l'avenir, mettez en surbrillance la ligne signalée par le message d'erreur. Dans ce cas, je pense que c'est 'mov user, buffer'. Le message d'erreur indique exactement quel est le problème: Les opérandes de l'instruction 'mov' ne sont pas légaux. Vérifiez le manuel du processeur. Il liste les combinaisons d'opérandes valides. Mémoire-à-mémoire n'est pas sur la liste. –

Répondre

1

J'ai changé le code pour ReadString va directement à l'utilisateur, et la sortie est correcte.

;Get Username and Greet 
mov edx,OFFSET question 
call WriteString 
call Crlf 

mov edx,OFFSET user 
mov ecx,SIZEOF user 
call ReadString 

mov edx,OFFSET greet 
call WriteString 
mov edx,OFFSET user 
call WriteString 
call Crlf