assume cs:code,ds:data,ss:stack
stack segment
db 64 dup (0)
stack ends
data segment
dw 123,1222,0,88,388,36,3434
data ends
data1 segment
db 10 dup (0) ;转换后保存的的结果
data1 ends
code segment
start:
mov ax,stack
mov ss,ax
mov sp,64
push bp
mov bp,sp
sub sp,6 ;第一个函数参数 function(data1,index,data)
mov ax,data ;ds,index,es
mov [bp-2],ax
mov word ptr[bp-4],0
mov ax,data1
mov [bp-6],ax
sub sp,6 ;第二个函数参数 function(cx,行列,0b800h)
mov dh,10 ;行
mov dl,10 ;列
mov cl,01000010b ;颜色
mov [bp-6-2],0b800h ;es 0b800h
mov [bp-6-4],dx ;行列
mov [bp-6-6],cx ;颜色
mov cx,8
lo:
push cx
call calc ;转换字符,保存到data1
pop cx
add word ptr[bp-4],2 ;偏移下一个字
push cx
call show_string ;打印字符串
pop cx
mov ah,[bp-9] ;打印字符串,下一行
add ah,1
mov [bp-9],ah
loop lo
add sp,12 ;还原sp
pop bp
mov ax,4c00h
int 21h
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;程序结束
calc: ;转换字符
push bp
mov bp,sp
mov ax,[bp+6+6] ;读取参数
mov es,ax
mov ax,[bp+8+6] ;读取参数
mov si,ax
mov ax,[bp+0ah+6] ;读取参数
mov ds,ax
push di ;局部变量中需要用到的变量
sub di,di
sub dx,dx
mov ax,ds:[si]
mov bx,10
lo1:
div bx
add dl,30H
push dx
;mov byte ptr es:[di],dl ;保存结果
inc di ;次数累计器
mov cx,ax
sub dx,dx
jcxz over_2
jmp lo1
over_2:
mov cx,di
sub di,di
lo2:
pop dx ;处理倒序字符
mov byte ptr es:[di],dl ;保存结果
inc di
loop lo2
mov byte ptr es:[di],0
pop di
pop bp
ret
show_string:
push bp ;备份环境
mov bp,sp
mov dx,[bp+6] ;颜色
mov ax,[bp+8] ;行号 行号需要计算所以保存在ax
mov bx,[bp+10]
mov es,bx ;显示段地址
mov bx,[bp+12]
mov ds,bx ;打印的字符串首地址
sub bx,bx
mov bl,al ;偏移在多少列?
add bl,bl ;一个160个字节 1个字符需要占用2个字节
mov di,bx
mov al,ah ;偏移在多少行?
mov bx,160
mul bl
add di,ax
mov ax,dx ;备份颜色
sub cx,cx
sub si,si
show_string1:
mov bl,ds:[si] ;读取值
mov es:[di],bl ;字符
mov byte ptr es:[di].1,al ;颜色
mov cl,bl
add di,2
inc si
jcxz show_string_over
jmp show_string1
show_string_over:
pop bp ;恢复在函数使用的环境
ret ;返回函数,4表示在调用函数时传入的参数sp+4
code ends
end start