TASM:尝试使用指令修改常量时出错

时间:2016-05-19 15:49:06

标签: assembly x86 tasm

我得到"参数需要类型覆盖"由于尝试增加常量值而导致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

1 个答案:

答案 0 :(得分:2)

您的代码需要进行以下更改:

  1. 将常量转换为变量
  2. 由于这些变量,您需要拆分添加内容。
  3. 此外,由于变量,有必要初始化数据段。
  4. 以下是包含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