;之前那个题目看错了,原来时要在8行3列这个地方打印字符串
;0 0写了几个小时的成果- - (╯-_-)╯╧╧ 晕死
assume cs:codesg,ds:datasg,ss:stack
datasg segment
db 'Welcome to masm! ',0
datasg ends
stack segment
dw 64 dup(0)
stack ends
codesg segment
start:
mov dh,8 ;行号
mov dl,3 ;列数
mov cl,2 ;绿色
mov ax,datasg
mov ds,ax
mov si,0 ;ds:si指向字符串的首地址
mov ax,stack
mov ss,ax
mov sp,128
call show_str
mov ax,4c00h
int 21h
;打印dh行dl列的字符串
show_str:
push cx
push si
mov ax,0b800h
mov es,ax ;es定位显存基地址
mov ax,0
mov al,160
dec dh ;行号在显存下从0开始,所以减一
mul dh ;
mov bx,ax ;把放在ax中的乘积放到bx中
mov al,2 ;每个字符占2个字节
mul dl ;定位列
sub ax,2 ;每个字符占2个字节
add bx,ax
mov ah,cl ;低位存放颜色,因为cl下面要用来临时存放要处理的字符
mov di,0 ;es:[bx+di]指向要写入的显存的地址
call print
pop si
pop cx
ret ;返回
;打印字符串
print:
mov cl,[si]
mov ch,0
jcxz ok ;判断当前字符是否到0,到了就停止这个打印
mov al,[si]
mov es:[bx+di],ax ;写入显存显示
inc si
add di,2
jmp short print ;如果没打印完,就继续往后打印
ok:
ret
codesg ends
end start
x86汇编--(八)指定位置打印字符串(七改)
最新推荐文章于 2023-09-26 20:14:47 发布