You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

8086 MASM图形编程:如何放大字母'D'且避免变形

8086 MASM图形编程:字母'D'放大变形问题解决思路

问题根源

你的代码核心问题在于:

  • 当前Hert数组是6行×9列的点阵数据,仅对应6×9像素的小字符,直接调整坐标范围但未匹配点阵尺寸,会导致数组读取越界或绘制错位,引发变形。
  • 原draw过程是逐像素1:1映射,无缩放逻辑,单纯扩大坐标区间会出现大量无数据填充的空白像素,破坏字符形状。

解决方案1:直接定义高分辨率点阵

重新构建放大后的字符点阵(比如将原6×9放大为12×18),每个原像素重复2次,确保点阵尺寸与绘制坐标范围完全匹配:

.model small
.stack 0100h
.data

; 12行×18列的放大版'D'点阵(原尺寸2倍)
Hert    db 04,04,04,04,04,04,04,04,00,00,00,00,00,00,00,00,00,00
        db 04,04,00,00,00,00,00,04,04,00,00,00,00,00,00,00,00,00
        db 04,04,00,00,00,00,00,04,04,00,00,00,00,00,00,00,00,00
        db 04,04,00,00,00,00,00,04,04,00,00,00,00,00,00,00,00,00
        db 04,04,00,00,00,00,00,04,04,00,00,00,00,00,00,00,00,00
        db 04,04,00,00,00,00,00,04,04,00,00,00,00,00,00,00,00,00
        db 04,04,00,00,00,00,00,04,04,00,00,00,00,00,00,00,00,00
        db 04,04,00,00,00,00,00,04,04,00,00,00,00,00,00,00,00,00
        db 04,04,00,00,00,00,00,04,04,00,00,00,00,00,00,00,00,00
        db 04,04,00,00,00,00,00,04,04,00,00,00,00,00,00,00,00,00
        db 04,04,04,04,04,04,04,04,00,00,00,00,00,00,00,00,00,00
        db 04,04,04,04,04,04,04,04,00,00,00,00,00,00,00,00,00,00
        
xi dw 0
xf dw 0
yi dw 0
yf dw 0

.code
main proc
    mov ax, @data
    mov ds, ax
    
    ; 设置320x200 256色模式
    mov al, 13h
    mov ah, 00h
    int 10H

    ; 坐标对应12行×18列的点阵
    mov si, offset Hert
    mov yi, 30
    mov yf, 42  ; 30+12=42
    mov xi, 30
    mov xf, 48  ; 30+18=48
    call draw
    
    mov ah, 04ch
    int 21h
main endp

draw proc
    mov ah, 0ch          ; 像素绘制功能
    mov dx, yi           ; 起始Y坐标
y_loop:
    mov cx, xi           ; 起始X坐标
x_loop:
    mov al, [si]         ; 取颜色值
    int 10h              ; 画像素
    inc si
    inc cx
    cmp cx, xf
    jb x_loop
    inc dx
    cmp dx, yf
    jb y_loop
    ret
draw endp

end

解决方案2:实现像素块缩放(复用原点阵)

不需要修改原Hert数组,修改draw过程,让每个原点阵像素对应屏幕上N×N的像素块(比如N=2,放大2倍),这样可以灵活调整缩放比例:

.model small
.stack 0100h
.data

Hert    db 04,04,04,04,00,00,00,00,00 ; 原6行×9列点阵
        db 04,00,00,00,04,00,00,00,00
        db 04,00,00,00,04,00,00,00,00
        db 04,00,00,00,04,00,00,00,00
        db 04,00,00,00,04,00,00,00,00
        db 04,04,04,04,00,00,00,00,00
        
xi dw 0
xf dw 0
yi dw 0
yf dw 0
scale equ 2  ; 缩放因子,设为2表示放大2倍

.code
main proc
    mov ax, @data
    mov ds, ax
    
    mov al, 13h
    mov ah, 00h
    int 10H

    ; 计算缩放后的坐标范围:原6行×scale=12行,原9列×scale=18列
    mov si, offset Hert
    mov yi, 30
    mov yf, 30 + 6*scale
    mov xi, 30
    mov xf, 30 + 9*scale
    call draw_scaled
    
    mov ah, 04ch
    int 21h
main endp

; 带缩放的绘制过程
draw_scaled proc
    mov ah, 0ch
    mov dx, yi           ; 起始Y坐标
y_row:
    mov cx, xi           ; 起始X坐标
    mov di, si           ; 保存当前点阵行的起始地址
x_col:
    mov al, [di]         ; 取当前点阵像素颜色
    ; 绘制scale×scale的像素块
    mov bx, scale
block_y:
    mov cx, xi + (di - si)*scale  ; 计算块的起始X
    push dx                     
block_x:
    int 10h
    inc cx
    dec bx
    jnz block_x
    pop dx
    inc dx
    mov bx, scale
    dec bx
    jnz block_y
    ; 移动到下一个点阵像素
    inc di
    cmp di, si + 9       ; 检查是否到当前行末尾(原行9列)
    jb x_col
    ; 移动到下一个点阵行
    add si, 9
    add dx, scale - 1    ; 跳过已绘制的scale行
    cmp dx, yf
    jb y_row
    ret
draw_scaled endp

end

内容的提问来源于stack exchange,提问作者vintage12

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 02:07:49