Assembly TASM:尝试使用指令修改常量时出错
由于试图增加常量值,我在TASM中遇到“参数需要类型重写”错误。我也不能使用变量,因为这样我就不能简单地将它们彼此相加,得到“操作数类型不多”的错误。有没有办法增加一个常数或增加两个变量?我尝试过使用寄存器——我的意思是将常数复制到寄存器,然后增加寄存器,它就工作了,但这并不能解决我的问题。谢谢你的建议Assembly TASM:尝试使用指令修改常量时出错,assembly,x86,tasm,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
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
您的代码需要进行以下更改:
你从哪里得到这些错误?只需运行代码就可以了(很好的矩形!)。尝试
h dw 50
而不是h=50
中的data
。其他的也一样。当尝试在主循环的末尾增加x和y常量时,以及当将它们更改为dw类型时,出现“操作数类型不匹配”和“无法添加相对数量”错误当我仅更改x和y do dw类型时,没有错误,但我得到的不是白色屏幕上的矩形。常量被复制到它们使用的任何地方,所以没有一个存储位置可以修改。这就是定义常量的全部要点:这只是另一种编写add ax,10
或其他东西的方法,它将汇编成add ax,imm8
常量直接嵌入到指令中。要修改的任何内容都需要在寄存器或内存中。如果你有足够的寄存器,保持变量在寄存器中是很好的。不是所有的常量都必须成为变量。尽量保持汇编时间常数。这是汇编语言。没有编译器可以优化任何未来的校对,所以用这种方式编写代码不是一个好习惯或建议。编写好代码的一个重要部分是找出什么可以是汇编时间常数。我不喜欢一开始就提出坏习惯或做法。如果您解释了错误,而不是仅仅给出修复,这将是一个更好的答案。我在一篇关于这个问题的评论中简要地提到了这一点(一旦我发现OP试图在运行时修改常量,而不仅仅是使它们变大并重新组装!)问题的全部答案取决于理解可以直接编码到指令中的组装时间常量与加载/存储到mem之间的区别。我认为,思考OPs问题的哪个是哪个将有助于理解。非常简单,谢谢Jose,但是我不得不将k1和k2保留为常量,否则会出现“操作数类型不匹配”。只是想知道为什么“dd”类型不起作用?你知道怎么把它从边缘弹出来,然后用颜色填满里面吗?谢谢大家
.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
.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