2009-11-29 51 views
-2

我已经写了一个算法来模拟布斯算法,只使用Add,Sub和Logical Operators并返回一个十六进制值。我的Tasm编译器不断抛出这些错误。当我试图修改代码时,它仍然不起作用。请有人帮助我。需要装配编程帮助(TASM) - 布斯算法

(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

如果你帮我们了解了一下,并告诉我们代码中有哪些行号,那会很酷。 – mrduclaw 2009-11-29 00:50:20

+0

第四个错误很快发现,你键入res2,但你只有res。 – mrduclaw 2009-11-29 00:51:44

+0

这一行是完全无效的:'mov ax,seg prompt,prompt2,res,ans,hold,n1,n2'。它必须只是“移动斧头,数据”。你也应该使用'假设cs:代码,ds:data,ss:stack' – fviktor 2009-11-29 01:14:42

回答

2

我ASM是一个有点生疏,但你可以尝试这些变化:

线29:

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

或交替:

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

线38 :

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

线44:

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

线52:

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

线126 - 我不知道是怎么回事......在你的代码

+0

考虑之后,你说什么我修改了代码,但 MOV [N1],BL MOV(N2),BL 仍然给我: >非法立即 下面是我对所做的修改第一误差: MOV AX,SEG提示;,PROMPT2,RES,ANS,保持,N1,N2 MOV AX,SEG PROMPT2 MOV AX,SEG RES MOV AX,SEG ANS MOV AX,SEG保持 MOV AX ,seg n1 mov ax,n2 mov ds,ax – Julian 2009-11-29 01:26:56

+0

你不需要那么多“'mov ax,'“命令......这些命令的目的是将数据段的地址加载到ds寄存器中......只需要一个。 – Stobor 2009-11-29 23:17:23

0

错误:

此线路完全无效:

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

它必须是公正:

move ax,data 

你还应该包括start:在此之前右:

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

这些都是无效的,因为好,既然你想定义内存变量,我猜:

n1=0 
n2=0 

应该是:

n1 db 0 
n2 db 0 

当您访问n1n2写这样一来,作为Stobor已经指出:

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

所有变量引用在装配“处理”完成的,因此方括号。

而且您还没有定义RES2,正如评论中已经注明的那样。

希望这会有所帮助。

参见:

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

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

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

添加评论在这里,如果事情是不够清晰。

+0

感谢您的输入。当我在“开始”之前添加“假设cs:代码,ds:data,ss:stack”时,我得到了许多(12)错误类型相同的“未定义符号:代码”。 – Julian 2009-11-29 01:47:47