2016-05-19 14 views
2

Ich bekomme "Argument benötigt Typ Override" Fehler in TASM aufgrund des Versuches, einen konstanten Wert zu erhöhen. Ich kann auch keine Variablen benutzen, weil ich sie dann nicht einfach hinzufügen kann und den Fehler "Operandentypen nicht viel" bekommen. Gibt es eine Möglichkeit, eine Konstante zu erhöhen oder zwei Variablen hinzuzufügen? Ich habe versucht, Register zu verwenden - ich meine, die Konstante in ein Register zu kopieren und dann das Register zu vergrößern, und es funktioniert, aber das löst mein Problem nicht. Danke für Anregungen.TASM: Fehler beim Versuch, eine Konstante mit einer Anweisung zu ändern

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

Woher bekommen Sie diese Fehler? Habe deinen Code einfach ausgeführt und es ist gut (nette Rechtecke!). –

+0

Probieren Sie 'h dw 50' anstelle von' h = 50' in 'data' aus. Das Gleiche für die anderen. –

+0

Fehler angezeigt, wenn versuchen, X- und Y-Konstanten am Ende der Hauptschleife zu erhöhen, auch wenn sie zu Dw-Typ ändern dann erhalten "Operandentypen nicht übereinstimmen" und "kann relative Mengen hinzufügen" Fehler – dimon

Antwort

2

Ihr Code diese Änderungen benötigt:

  1. Konvertieren Sie Ihre Konstanten in Variablen
  2. Aufgrund der Variablen, müssen Sie die Zugänge spalten.
  3. Auch wegen der Variablen ist es notwendig, das Datensegment zu initialisieren.

Hier Ihr Code mit den drei Änderungen ist (spitz durch „Pfeile“):

.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 

nun das gefüllte Rechteck Die Idee ist, die horizontale Linie viele Male zu erhöhen y zu ziehen:

.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

Nicht alle Konstanten müssen zu Variablen werden. So viel wie möglich sollte Assemble-Zeit Konstanten bleiben. –

+0

Dies ist die Assemblersprache. Es gibt keinen Compiler, der Zukunftssicherheit optimiert, daher ist es keine gute Angewohnheit oder ein guter Vorschlag, so zu programmieren. Ein wichtiger Teil des Schreibens von gutem Code ist herauszufinden, was eine Assembler-Konstante sein kann. –

+0

Ich mag es nicht, schlechte Angewohnheiten oder Praktiken vorzuschlagen. Wenn Sie den Fehler erklärt hätten, anstatt nur das Problem zu beheben, wäre dies eine bessere Antwort. Ich machte das kurz in einem Kommentar zu der Frage (sobald ich herausfand, dass das OP versuchte, Konstanten zur Laufzeit zu modifizieren, sie nicht nur größer zu machen und wieder zusammenzusetzen!) Die ganze Antwort auf das Problem hängt davon ab, den Unterschied zu verstehen zwischen einer Assembly-Zeitkonstante, die direkt in die Anweisungen codiert werden kann, vs. load/store to mem. Nachdenken darüber, was für das OP-Problem das Verständnis hilft, denke ich. –