我需要帮助在汇编中构建一个不成比例的三角形,并且在汇编中也需要if / else语句

时间:2015-03-26 17:52:44

标签: assembly

所以,我有这个代码用于装配中的三角形,问题是我只允许构建比例三角形,如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 

2 个答案:

答案 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

注意:

  • 小心高度的三角形>宽度;在到达顶行之前,我的计算将达到零,这将导致您绘制一行256像素。您必须在进入循环之前测试零以防止这种情况。
  • 尺寸> 255,需要进行一些调整。
  • div轮次' down' (朝零);如果您想要舍入到最接近的整数,请尝试((135 * r )+(40/2))/ 40. add ax,20和{{1之间的mul }}。
  • 我还没有测试过,抱歉。