yxjxdb 发表于 2021-3-2 10:42:14

实验9 作业

本帖最后由 yxjxdb 于 2021-5-21 15:40 编辑

感谢小甲鱼老师的视频!

assume cs:code,ss:stack,ds:data
data segment
             db 'Welcome to masm!'
             db 10000010B,00100100B,01110001B   ;8bit颜色属性为:闪烁+R+G+B+高亮+R+G+B
data ends

stack segment
            dw 8 dup(0)
stack ends

code segment
      start:mov ax,data
                mov ds,ax       ;源数据段地址
                mov ax,0b872h   ;物理地址0B800H:720H是25行最中间的起始地址,直接写成0B872H:0H用bp偏移(不理解可以看王爽老师P24)
                mov es,ax       ;目标数据段地址,显存
                mov bx,0      ;源数据偏移地址
                mov si,0      ;颜色数据源偏移地址,db第二行的三字节数据
                mov di,0      ;颜色数据目标偏移地址               
                mov bp,0      ;目标数据行偏移地址

                mov cx,3      ;外循环3次
                s0:push cx      ;外循环次数先后入栈3\2\1

                mov cx,10h      ;内循环16次,(16个字节)
                s:mov al,
                mov es:,al      ;目标地址偶数据位单元0,2,4……写入16个字符的ascii码
                mov al,10h          ;读源数据第二行颜色数据
                mov es:,al   ;在ascii后面的奇数位1,3,5……字节单元写入颜色数据
                inc bx            ;每次循环递增1(16次取16个ascii码)
                add di,2      ;2个字节单元:ascii+颜色属性
                loop s

                mov di,0      ;s循环后清0
                mov bx,0      ;s循环后清0
                add bp,0a0h   ;目标单元偏移160个字节
                inc si          ;取源数据的下一个颜色属性
                pop cx          ;cx在s循环后为0,所以出栈
                loop s0         ;cx=cx-1

                mov ax,4c00h
                int 21h

code ends

end start
补充:720H的计算
160x11+(160-16x2)/2=1824(720H)


开始有个疑问栈是否多余?经过测试觉得经过s0循环后栈内数据应该是变化的。敬请指正。
页: [1]
查看完整版本: 实验9 作业