0
点赞
收藏
分享

微信扫一扫

《汇编语言》王爽 实验九

要求

image20220324105614867.png

收集数据

颜色

image20220324103821915.png

所以:

绿色(默认黑底):02h

绿底红色:24h

白底蓝色:71h

确定行起点(es),行内偏移量

es位置:

25行中,让3行显示在中间,就是上下各11个空行,又因每页缓冲区为80\2\25=4000字节,显存缓冲区起点为B800,所以:

es = b800*10h 加上 802 \11 得 b800:06e0,也就是b86e的段地址

行偏移:

因为要打印的为16字符,每个字符会占2字节,就是32字节。又一行有160字节 (160-32)/2 = 64字节 = 40h

注:40h作为idata即可,

代码

assume cs:code, ds:data, ss:stack

data segment
    db 'welcome to masm!'
    db 02h, 24h, 71h
data ends

stack segment
    dw 6 dup(0) ;申请6个word的栈空间,用于保存循环变量用
stack ends

code segment
start:
    mov ax, data
    mov ds, ax
    mov ax, stack
    mov ss, ax
    mov sp, 0eh ;空栈栈顶
    mov ax, 0b86eh ;要打印行的段起点
    mov es, ax

    mov cx, 3h ;3行
    mov si, 10h ;循环颜色,ds偏移量
s1:
    push cx
    mov bx, 0 ;每行从头循环字符

    mov cx, 10h ;内循环16次拷贝ds区域到显存缓冲区行
    mov di, 0 ; 索引列
    s2:    
        mov ax, 0
        mov al, [bx]
        mov ah, ds:[si]
        mov es:[40h+di],ax
        inc bx;
        add di, 2 ;下一列需要移动2个字节
        loop s2
    inc si ;si切换到下1个颜色
    ; es切换到下一行
    mov ax, es
    add ax, 0ah ;+160字节到下一行,段地址需要除以16再相加
    mov es, ax

    pop cx
    loop s1

    mov ax, 4c00h
    int 21h
code ends

end start

结果

image20220324121839303.png

举报

相关推荐

0 条评论