所以,我有这个代码用于装配中的三角形,问题是我只允许构建比例三角形,如75 * 75等等。我需要建立一个135 * 40,在某些时候我会在一个cicle中一次删除2个像素,有人可以帮助我。
mov cx, 176 ;coluna
mov dx, 80 ;linha
mov [cont], 75
ciclo2:
mov al,[cont]
mov [cont2], al ; cont2 will be initialized with 75, 74, ...
ciclo1:
;ativa um pixel
mov ah, 0Ch
mov al, 4
mov bh, 0
int 10h
dec cx
dec byte [cont2]
jnz ciclo1
mov cx, 176
dec dx
dec byte [cont]
jnz ciclo2
答案 0 :(得分:1)
填充的135 * 40像素三角形中每条线之间的宽度差异不是整数。如果您愿意,可以使用浮点运算,但更简单的方法是使用定点运算。也就是说,将值缩放某个位数(例如8,即乘以256) 最底部的行将是135像素宽,因此从值135 * 256 == 34560开始。内部循环的循环计数将是该单词的高字节,即34560>> 8 == 34560/256 == 135.然后我们在内循环后从这个值中减去(135/40)* 256 == 864,这样下一行就会略短:
; cont2_init is a word variable (2 bytes)
mov cx, 160 ;coluna
mov dx, 80 ;linha
mov [cont], 40
mov [cont2_init],34560 ; 34560 = 135 * 256
cicloc2: ;ciclo que repete a linha até fazer um quadrado
mov al,[cont2_init+1] ; get the whole part of the fixed-point number
mov [cont2], al
cicloc1: ;ciclo que cria a linha
;ativa um pixel
mov ah, 0Ch ;desenha nos pixeis do ecra
mov al, 4 ;determina a cor
mov bh, 0 ;numero de pagina grafica
int 10h
dec cx
dec [cont2]
jnz cicloc1
mov cx, 160
dec dx
sub [cont2_init],864 ; 864 = (135 / 40) * 256
dec [cont]
jnz cicloc2
答案 1 :(得分:0)
对于135像素宽,40像素高的三角形,行 r 的宽度为(135 * r )/ 40.所有整数数学;不需要浮点数或定点数学。如果在除法之前进行乘法,则没有数字丢失。
只需替换:
mov al,[cont]
mov [cont2], al
由:
mov al,[cont] ; AL = row
mov bl,135
mul bl ; AX = AL * BL = row * 135
mov bl,40
div bl ; AL = AX / BL = (row * 135) / 40
mov [cont2], al
注意:
div
轮次' down' (朝零);如果您想要舍入到最接近的整数,请尝试((135 * r )+(40/2))/ 40. add ax,20
和{{1之间的mul
}}。