2016-05-19 10 views
2

定数値を増やそうとしたために、TASMで「引数が必要です」というエラーが発生しました。私は変数を使うこともできません。なぜなら、単にそれらをお互いに追加したり、 "オペランドの型はあまりない"というエラーを得ることができないからです。定数を増やしたり、2つの変数を追加する方法はありますか?私はレジスタを使用しようとしました - 私はレジスタに定数をコピーし、レジスタを増やすことを意味し、それは動作しますが、これは私の問題を解決しません。ご意見ありがとうございます。TASM:命令で定数を修正しようとしたときにエラーが発生しました

model tiny 
.486 
.stack 200h 

.data 
h = 50 
w = 100 
x = 10 
y = 10 
k1 = 15 
k2 = 0 

.code 
start: 
mov ah, 0  ; graphics mode 
mov al, 13h 
int 10h 

; main loop 
mov cx, 50 
pg: 
push cx 

; top line 
mov cx, x+w ; column 
mov dx, y  ; row 
mov al, k1  ; white 
p1: 
mov ah, 0ch ; put pixel 
int 10h 
dec cx 
cmp cx, x 
jae p1 

; bottom line 
mov cx, x+w 
mov dx, y+h 
mov al, k1  
p2: 
mov ah, 0ch 
int 10h 
dec cx 
cmp cx, x 
ja p2 

; left line 
mov cx, x 
mov dx, y+h 
mov al, k1  
p3: 
mov ah, 0ch  
int 10h 
dec dx 
cmp dx, y 
ja p3 

; right line 
mov cx, x+w 
mov dx, y+h 
mov al, k1  
p4: 
mov ah, 0ch 
int 10h 
dec dx 
cmp dx, y 
ja p4 

; delay 
mov cx, 01h 
mov dx, 4240h 
mov ah, 86h 
int 15h 

; top line 
mov cx, x+w 
mov dx, y  
mov al, k2  
p5: 
mov ah, 0ch 
int 10h 
dec cx 
cmp cx, x 
jae p5 

; bottom line 
mov cx, x+w 
mov dx, y+h 
mov al, k2  
p6: 
mov ah, 0ch  
int 10h 
dec cx 
cmp cx, x 
ja p6 

; left line 
mov cx, x 
mov dx, y+h 
mov al, k2  
p7: 
mov ah, 0ch  
int 10h 
dec dx 
cmp dx, y 
ja p7 

; right line 
mov cx, x+w 
mov dx, y+h 
mov al, k2  
p8: 
mov ah, 0ch  
int 10h 
dec dx 
cmp dx, y 
ja p8  

pop cx 
dec cx 
cmp cx, 50 
;inc x 
;inc y 
jna pg 

mov ah,00  ; read keyboard 
int 16h   

mov ah,00  ; text mode 
mov al,03 
int 10h 

mov ah,4ch  ; exit 
int 21h 

end start 
+0

これらのエラーはどこで手に入りますか?ちょうどあなたのコードを実行し、それは良いです(素敵な長方形!)。 –

+0

'data'に' h = 50'の代わりに 'hdw 50'を試してください。他の人も同じです。 –

+0

メインループの最後にxとy定数を増やしてみてください。また、dw型に変更してから「オペランドの型が一致しません」と「相対量を取ることができません」というエラーが表示される – dimon

答えて

2

あなたのコードでは、これらの変更を必要とする:

  1. があるため、変数の変数
  2. にあなたの定数を変換し、あなたは追加を分割する必要があります。
  3. また、変数のために、データセグメントを初期化する必要があります。ここで

は(「矢印」で指さ)3つの変更にあなたのコードです:

.model small 
.stack 200h 

.data 
h dw 50     ;<========================= 
w dw 100     ;<========================= 
x dw 10     ;<========================= 
y dw 10     ;<========================= 
k1 db 15     ;<========================= 
k2 db 0     ;<========================= 

.code 
start: 
mov ax, @data    ;<========================= 
mov ds, ax    ;<========================= 

mov ah, 0  ; graphics mode 
mov al, 13h 
int 10h 

; main loop 
mov cx, 50 
pg: 
push cx 

; top line 
mov cx, x;+w ; column ;<========================= 
add cx, w     ;<========================= 
mov dx, y  ; row 
mov al, k1  ; white 
p1: 
mov ah, 0ch ; put pixel 
int 10h 
dec cx 
cmp cx, x 
jae p1 

; bottom line 
mov cx, x;+w    ;<========================= 
add cx, w     ;<========================= 
mov dx, y;+h    ;<========================= 
add dx, h     ;<========================= 
mov al, k1  
p2: 
mov ah, 0ch 
int 10h 
dec cx 
cmp cx, x 
ja p2 

; left line 
mov cx, x 
mov dx, y;+h    ;<========================= 
add dx, h     ;<========================= 
mov al, k1  
p3: 
mov ah, 0ch  
int 10h 
dec dx 
cmp dx, y 
ja p3 

; right line 
mov cx, x;+w    ;<========================= 
add cx, w     ;<========================= 
mov dx, y;+h    ;<========================= 
add dx, h     ;<========================= 
mov al, k1  
p4: 
mov ah, 0ch 
int 10h 
dec dx 
cmp dx, y 
ja p4 

; delay 
mov cx, 01h 
mov dx, 4240h 
mov ah, 86h 
int 15h 

; top line 
mov cx, x;+w    ;<========================= 
add cx, w     ;<========================= 
mov dx, y  
mov al, k2  
p5: 
mov ah, 0ch 
int 10h 
dec cx 
cmp cx, x 
jae p5 

; bottom line 
mov cx, x;+w    ;<========================= 
add cx, w     ;<========================= 
mov dx, y;+h    ;<========================= 
add dx, h     ;<========================= 
mov al, k2  
p6: 
mov ah, 0ch  
int 10h 
dec cx 
cmp cx, x 
ja p6 

; left line 
mov cx, x 
mov dx, y;+h    ;<========================= 
add dx, h     ;<========================= 
mov al, k2  
p7: 
mov ah, 0ch  
int 10h 
dec dx 
cmp dx, y 
ja p7 

; right line 
mov cx, x;+w    ;<========================= 
add cx, w     ;<========================= 
mov dx, y;+h    ;<========================= 
add dx, h     ;<========================= 
mov al, k2  
p8: 
mov ah, 0ch  
int 10h 
dec dx 
cmp dx, y 
ja p8  

pop cx 
dec cx 
cmp cx, 50 
;inc x 
;inc y 
jna pg 

mov ah,00  ; read keyboard 
int 16h   

mov ah,00  ; text mode 
mov al,03 
int 10h 

mov ah,4ch  ; exit 
int 21h 

end start 

今塗りつぶされた矩形アイデアはy増加し、水平線を引く何回もすることです:

.model small 
.stack 200h 

.data 
h dw 50 
w dw 100 
x dw 10 
y dw 10 
k1 db 15 
k2 db 0 

.code 
start: 
mov ax, @data 
mov ds, ax 

mov ah, 0  ; graphics mode 
mov al, 13h 
int 10h 

; main loop 
mov cx, 50 
pg: 
push cx 

; top line 
mov cx, x;+w ; column 
add cx, w 
mov dx, y  ; row 
mov al, k1  ; white 
p1: 
mov ah, 0ch ; put pixel 
int 10h 
dec cx 
cmp cx, x 
jae p1 

pop cx 
inc y   ;<============= NEXT HORIZONTAL LINE WILL BE DRAWN IN THE NEXT LINE. 
dec cx 
cmp cx, 50 
;inc x 
;inc y 
jna pg 

mov ah,00  ; read keyboard 
int 16h   

mov ah,00  ; text mode 
mov al,03 
int 10h 

mov ah,4ch  ; exit 
int 21h 

end start 
+2

すべての定数が変数になる必要はありません。可能な限り組立時定数を維持する必要があります。 –

+0

これはアセンブリ言語です。将来の校正を最適化するコンパイラはありませんので、このようにコードを書くのは良い習慣ではありません。良いコードを書く上で重要なことは、何が組み立て時定数であるかを理解することです。 –

+0

最初は悪い習慣や習慣を示唆するのが好きではありません。単に修正を与えるのではなく、エラーを説明した場合、これはより良い答えになります。私はその質問に対するコメントで簡単に言いました(OPが実行時に定数を修正しようとしていたのを見たら、それを大きくして再構築するのではなくて!)問題に対する全回答は、命令に直接エンコードできるアセンブル時定数と、memへのロード/ストアとの間OPの問題のどちらが理解に役立つかを考えていると思います。 –

関連する問題