1.显示字符串
assume cs:codesg
data segment
db 'Welcome to masm!',0
data ends
stack segment
db 16 dup (0)
stack ends
codesg segment
start: mov dh,0 ;行 0~23
mov dl,0 ;列 0~79 可以80,但会到下一行,dl*2<255就行
mov cl,2 ;颜色
mov ax,data
mov ds,ax
mov si,0
mov di,0
call show_str
back: mov ax,4c00h
int 21h
show_str:
mov ax,stack
mov ss,ax
mov sp,10h
call get_row ;计算得出行存在es
call calc_col ;计算在显存中真正列的地址
lpc: call get_col ;计算得出列存在di 下一行列在dx
;列是0 2 4 6....偶数的
push cx ;保存颜色
mov ah,cl ;写入显存的颜色
mov al,ds:[si] ;写入显存的字
mov es:[di],ax ;写入显存
inc si
mov ch,0 ;内容为0 跳转
mov cl,ds:[si]
jcxz back
pop cx ;恢复颜色
jmp lpc
get_row:
push cx ;保存颜色
push dx ;保存行列
mov ax,0B80ah
mov dl,dh ;行小于255 用低8位就行
mov dh,0
mov cx,dx
add cx,1 ;保证cx>=1
lp1: add ax,10
loop lp1
sub ax,10 ;减掉因为cx为0时多加的
pop dx ;恢复行列
pop cx ;恢复颜色
mov es,ax ;算出行
ret
get_col:
push dx ;保存行列
mov dh,0
mov di,dx
pop ax ;恢复行列到中继寄存器ax
mov dh,ah ;取原行
mov dl,al ;取原列
add dl,2 ;列+2 行列结果存在dx中
ret
calc_col:
push dx ;保存行列
mov al,dl ;列作为被乘数
mov dl,2 ;*2
mul dl ;结果不会超过160 因为只有80列
pop dx ;恢复行
mov dl,al ;保存真正的列到dl
ret
codesg ends
end start
汇编实验10 编写子程序
猜你喜欢
转载自blog.csdn.net/duling2/article/details/82962867
今日推荐
周排行