|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
本帖最后由 HTT_音乐 于 2014-6-25 10:18 编辑
- assume cs:code
- data segment
- db 30H, 31H, 32H, 33H, 34H, 35H, 36H, 0
- db 10 dup(0)
- data ends
- code segment
- start:
- mov ax, 12666
- mov bx, data
- mov ds, bx
- mov si, 0
- call dtoc
- mov dh, 8
- mov dl, 3
- mov cl, 2
- call show_str
- mov ax, 4C00H
- int 21H
- ; 名称:dtoc
- ; 功能:将word型数据转变为表示十进制数的字符串,字符串以0位结尾符
- ; 参数:(ax)=wrod型数据
- ; ds:si指向字符串的首地址
- ; 返回:无
- ; 应用举例:编程,将数据12666以十进制的形式在屏幕的8行3列,用绿色显示出来。
- dtoc:
- push ax
- push dx
- push cx
- push si
- s1: mov cx, 10
- call divdw
- add cl, 30H
- mov ds:[si], cl
- inc si
- mov cx, ax
- add cx, dx
- jcxz short ok1
- jmp s1
- ok1:mov ds:[si], cl
- pop si
- pop cx
- pop dx
- pop ax
- ret
- ; 名称:divdw
- ; 功能:进行不会产生溢出的除法运算,被除数为dword型,除数为word型,结果为dword型
- ; 参数:(ax)=dword型数据的低16位
- ; (dx)=dword型数据的高16位
- ; (cx)=除数
- ; 返回:(dx)=结果的高16位,(ax)=结果的低16位
- ; (cx)=余数
- ; 应用举例:计算 1000000/10(F4240H/0AH)
- divdw:
- push ax ; 把低16位数据存入栈空间
- mov ax, dx ; 把高16位数据放入ax寄存器
- mov dx, 0 ; 把高16位寄存器dx置为0
- div cx ; 除数cx是16位,所以被除数为32位,dx为高位,ax为低位
- ; 由于高16位放入低16位,所以得到的商时高16位的数据
- ; 除法规则余数必定小于除数,所以高位的余数会被除掉
- mov bx, ax ; 把高16位数据的商存入bx寄存器
- pop ax ; 取出栈空间的低16数据置入低16位
- div cx ; 高16位的余数和低16位的数一起相除
- mov cx, dx ; 把高16位获得的余数赋给cx(余数必定小于除数)
- mov dx, bx ; 把存入bx中的高16位的商还给高16位dx
- ret
- ; 名称:show_str
- ; 在指定的位置,用指定的颜色,显示一个用0结束的字符串。
- ; (dh)=行号(取值范围0~24),(dl)=列号(取值范围0~79)
- ; (cl)=颜色,ds:si制定字符串的首地址
- ; 返回:无
- ; 应用举例:在屏幕的8行2列,用绿色显示data段中的字符串
- show_str:
- push ax ; 保存子程序中用到的寄存器
- push bx
- push cx
- push dx
- push es
- push si
- mov ax, 0B800H ; 显存区开始地址
- mov es, ax
-
- mov al, 160 ; 计算在显存区的打印位置
- mul dh
- mov si, ax
- mov al, 2
- mul dl
- add si, ax
- mov al, cl ; 复制显存区的颜色
- mov bx, 0
- mov ch, 0
- s: mov cl, ds:[bx]
- jcxz short ok
- mov es:[si], cl ; 偶数位置存储ASCII编码
- mov es:[si+1], al ; 奇数位置存储颜色
- inc bx
- add si, 2
- jmp s
- ok: pop si ; 按顺序释放保存的寄存器
- pop es
- pop dx
- pop cx
- pop bx
- pop ax
- ret
- code ends
- end start
复制代码
我自己写的代码,debug查看内存中的数据是 66621.(倒序排列的勿怪)。可是最后为什么在显存中会显示不正确呢?
|
|