|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
分析:
其实就是16进制转为10进制,然后在打印。
按下键盘接收一个字符,进行编码,然后存储在内存。(字符编码后存储,用什么编码方法?ascii),用调速器debug查看都是二进制转为16进制的显示结果,要打印成10进制需要咱们自己转换
123d 十进制对应16进制 7BH
7bH / 10d = 商ch 余 3
ch / 10d = 商1 余 2
1 / 10d = 商0 余 1
结果就是321,倒序过来就是123,
- 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
复制代码
|
|