2009-11-29 8 views
-2

J'ai écrit un algorithme pour simuler l'algorithme de Booth en utilisant uniquement des opérateurs Add, Sub et Logical et renvoyer une valeur hexadécimale. Mon compilateur Tasm ne cesse de me lancer ces erreurs. Lorsque j'essaie d'omodifier le code, cela ne fonctionne toujours pas. Quelqu'un pourrait m'aider s'il vous plaît.Besoin d'aide à la programmation d'assemblage (TASM) - Algorithme de Booth

(29) Extra characters on line
(38) Illegal immediate
(44) Illegal immediate
(52) Underfined symbol: RES2
(126) Expecting pointer type

;Booths Algorithm 

; 
; 
; 
; 
; 


.model small 

.stack 

.data 
prompt db 13,10,"Enter first number to multiply. $" 
prompt2 db 13,10,"Enter second number to multiply. $" 
res db 13,10,"The answer is $" 

ans dw 2 
hold db 0 
n1=0 
n2=0 


.code 

start: 

mov ax,seg prompt,prompt2,res,ans,hold,n1,n2 
mov ds,ax 

mov ah,09h 
mov dx,offset prompt      
int 21h 

call read     

mov n1,bl    
mov ah,09h 
mov dx, offset prompt2   
int 21h 

call read     
mov n2,bl    


call Algorithm    

mov [ans],ax   
mov bx,ax 

mov dx,offset res2    
mov ah,09h 
int 21h 

call write    

mov ah,4ch 
int 21h 

hlt 

read:      
mov ah,00h    
mov [hold],bl 

f0: 
mov al,01h    
int 21h     
cmp al,0dh    
je Copy     
mov cl,al    
sub cl,30h    
mov al,[hold]   
mov bl,0ah    
mul bl     
mov [hold],al   
add [hold],cl   
jmp f0     


Copy : 
mov bl,[hold]   
ret      

Algorithm:      
mov ah,0    
mov al,n1   
mov cx,8     
mov bh,n2   
clc  

f1: 
mov bl,al  
and bl,1     
jnz f2    
    JNC f3    
    sub ah,bh    
jmp f3 

f2: 
jc f3 
add ah,bh 

f3: 
    shr ax,1 
    loop f1 
    ret 

write: 
mov al,bl 
lea di,[ans] 
mov bh,0ah 
mov cl,24h 
mov [di],cl 
dec di 

f4: 
mov ah,00h 
div bh 
add ah,30h 
mov [di],ah 
dec di 
cmp al,00h 
jnz 4 
inc di 
mov ah,09h 
mov dx,di 
int 21h 
ret 

end start 
+1

Ce serait cool si vous nous aidiez un peu et nous a montré les numéros de ligne qui sont dans le code. – mrduclaw

+0

La 4ème erreur est rapide à repérer, vous avez tapé res2, mais vous avez seulement res. – mrduclaw

+0

Cette ligne est complètement invalide: 'mov, prompt, prompt2, res, ans, hold, n1, n2'. Ce devrait être juste 'move ax, data'. Vous devriez également utiliser 'supposer cs: code, ds: données, ss: pile' – fviktor

Répondre

2

Mon asm est un peu rouillé, mais vous pouvez essayer ces changements:

ligne 29:

mov ax,@data ; should pick up the address of the data segment 

ou alternativement:

mov ax, seg prompt ; seg takes only one variable, not multiple... 

ligne 38 :

mov [n1],bl  ; memory addresses need square brackets 

ligne 44:

mov [n2],bl  ; memory addresses need square brackets 

ligne 52:

mov dx,offset res ; don't know where res2 came from 

ligne 126 - Je ne sais pas ce qui se passe ici ...

+0

Après avoir pris en considération ce que vous avez dit, je modifié mon code, mais le mov [n1], bl mov [n2], bl me donne encore: > illégale immédiate est la modification Ci-dessous je fait pour la première erreur: mov ax, SEG rapides;, prompt2, res, ans, tenir, n1, n2 hache mov, seg prompt2 hache mov, seg res hache mov, seg ans mov hache, tenez seg hache mov , seg n1 mov ax, n2 mov ds, ax – Julian

+0

Vous n'avez pas besoin de beaucoup de "mov" ax, '" commands ... Le but de ces commandes est de charger l'adresse du segment de données dans le registre ds ... Un seul est nécessaire. – Stobor

0

erreurs dans votre code: Cette ligne est complètement invalide:

mov ax,seg prompt,prompt2,res,ans,hold,n1,n2. 

Il devrait être juste:

move ax,data 

Vous devez également inclure ce droit avant start::

assume cs:code, ds:data, ss:stack 

Ce ne sont pas valides aussi bien, puisque vous vouliez définir des variables de mémoire, Je suppose:

n1=0 
n2=0 

Il devrait être:

n1 db 0 
n2 db 0 

Lorsque vous accédez n1 et n2 l'écrire de cette façon, comme Stobor déjà noté:

mov [n1],bl 
mov [n2],bl 

Toutes les références variables effectuées par « adressage » dans l'assemblage, de sorte que les crochets.

Et vous n'avez pas défini RES2 du tout comme indiqué dans un commentaire déjà.

Espérons que cela aide.

Voir aussi:

http://www.xs4all.nl/~smit/asm01001.htm

http://www.laynetworks.com/assembly%20tutorials2.htm

http://www.faqs.org/faqs/assembly-language/x86/borland/

Ajouter un commentaire ici si quelque chose ne suffit pas claire.

+0

Merci pour l'entrée. Quand j'ai ajouté "supposer cs: code, ds: données, ss: pile" avant le "début:" j'ai eu de nombreuses (12) erreurs du même type "Symbole non défini: CODE". – Julian

Questions connexes