-2

Add、Sub、および論理演算子のみを使用して Booth のアルゴリズムをシミュレートし、16 進数値を返すアルゴリズムを作成しました。私の Tasm コンパイラは、これらのエラーをスローし続けます。コードを変更しようとしても、まだ機能しません。誰かが私を助けてくれませんか。

(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
4

2 に答える 2

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 行目 - ここで何が起こっているのかわかりません...

于 2009-11-29T00:51:54.813 に答える
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

Stoborがすでに述べたように、この方法でアクセスn1して書き込むと、次のようになります。n2

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/

何かが十分に明確でない場合は、ここにコメントを追加してください。

于 2009-11-29T01:21:36.167 に答える