实验九
assume cs:code,ds:data,ss:stackdata segment
db 'welcome to masm!' ;一共16字节
db 02h,24h,71h ;黑底绿色,绿地红色,白底蓝色
code segment
stack segment
dd 8 dup(0)
stack ends
start:
mov ax,data
mov ds,ax
mov ax,0b800h ;显存地址
mov es,ax
mov ax,stack
mov ss,ax
mov si,35Eh ;显存偏移
mov bp,0 ;显示行数索引
mov cx,3
s0:
push cx
mov cx,16
mov bx,0 ;字符索引
s1: mov al,ds: ;读字符
mov ah,ds: ;读颜色
mov es:,ax ;写显存
add si,2
inc bx
loop s1
add si,80H ;切换到下一行,每行A0H(80x2)个字符,本行显示字符导致索
;引后移20H(16*2)位,再后裔80H(128)位,下一行刚好对齐
pop cx
inc bp
loop s0
mov ax,4c00h
int 21h
code ends
end start
想问下这个显存偏移是怎么算的
双人旁 发表于 2020-3-18 11:06
想问下这个显存偏移是怎么算的
显存的首地址时自己随便定义的,后面的偏移量的计算就是按每行显示80个字符,80个字符就是对应的160个字节(ascii一个字节,色彩控制一个字节),加索引160就刚好切换到当前索引位置的下一行出,比如写完第一行的'welcom to masm!'加160显存索引就到了‘!’下面去了,但是为了对齐,所以要减去'welcom to masm!'这个字符串显示的长度也就是16*2=32字节,综合一下就是160-32=128=80H,就刚好切换到下一行对齐的位置了 本帖最后由 sbx 于 2020-8-16 18:49 编辑
;111213行,64列开始存储字符串
;目的段(es)=b800h
;(di)=11*160+40=6e0h+40h=720h
assume cs:code,ds:data,ss:stack
data segment
db 'welcome to masm!'
db 2h,24h,71h
data ends
stack segment
db 8 dup(0)
stack ends
code segment
start: mov ax,data
mov ds,ax
mov bx,0
mov si,0
mov ax,stack
mov ss,ax
mov sp,16
mov ax,0b800h
mov es,ax
mov di,0
mov cx,3
s0:push cx
mov cx,16
s:mov al,
mov ah,
mov es:,ax
inc bx
add di,2
loop s
mov bx,0
inc si
mov di,0
mov ax,es
add ax,0ah
mov es,ax
pop cx
loop s0
mov ax,4c00h
int 21h
code ends
end start
页:
[1]