assume cs:codeseg,ss:stacksg,ds:datasg
stacksg segment
dw 0,0,0,0,0,0,0,0
stacksg ends
datasg segment
db 'ibm '
db 'dec '
db 'dos '
db 'vax '
datasg ends
codesg segment
start:
mov ax,stacksg ;初始化栈
mov ss,ax
mov sp,16
mov ax,datasg ;初始化数据
mov ds,ax
mov ax, 0b800h ;初始屏幕基址,显示在屏幕的基地址
mov es, ax
mov di,0
mov bx,0 ;行的开始
mov cx,4
s0:
push cx ;压栈保存CX
mov si,0 ;列的开始,每次进入下一行前是初始化为零
mov cx,3 ;x循环改变3列的数据
s1: mov al,[bx+si] ;定位具体的那一行那一列
and al,11011111B;转换大写
mov [bx+si],al ;把转换好的大写数据放回去该内存空间
mov es:[di],al ;显示在屏幕数据
mov es:[di+1],0002h;颜色
inc si
add di,2
loop s1
pop cx ;出栈还原CX
cmp cx,1 ;最后一个逗号就不要加上去了
je s2 ;判断直接跳转
mov es:[di],' ,' ;加个空格区分显示
mov es:[di+1],0002h
add di,2
add bx,16 ;下一行
s2:
loop s0
codesg ends
end start