需要汇编编程帮助(TASM) - Booth的算法

时间:2009-11-29 00:22:52

标签: algorithm assembly low-level tasm

我编写了一个算法,仅使用Add,Sub和Logical操作符来模拟Booth的算法,并返回一个十六进制值。我的Tasm编译器一直在向我抛出这些错误。当我尝试omodify代码时,它仍然无法正常工作。有人可以帮帮我吗。

  

(29)行上的额外字符
  (38)非法立即
  (44)非法立即   (52)未定义符号:RES2
  (126)期望指针类型

;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

2 个答案:

答案 0 :(得分: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行 - 我不确定这里发生了什么......

答案 1 :(得分: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/

如果某些内容不够清晰,请在此处添加评论。