马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
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.(倒序排列的勿怪)。可是最后为什么在显存中会显示不正确呢?
|