|
主题 : : 10 章 实验3 debug 跟踪正常。dos加载运行显示溢出 ??? [已解决] |
回复[ 2次 ]
点击[ 530次 ] | |
荣誉值:2
信誉值:0
注册日期:2011-05-14 08:56 |
assume cs:code
data segment
db 10 dup (0)
data ends
stack segment
db 32 (0)
stack ends
code segment
start: mov ax,12666
mov bx,data ;初始化数据段
mov ds,bx
sub si,si
mov bx,stack ;初始化栈
mov ss,bx
mov sp,32
call dtoc ;调用子列程 dtoc 算出十进制的ascii码
mov dh,8 ;设置 行 列 属性
mov dl,3
mov cl,2
call show_str ;调用子列程 show_str 显示字符串
mov ax,4c00h ;程序返回
int 21h
dtoc: push bx ;压栈寄存器中的数据
push cx
push dx
push di
mov bx,0ah ;参数除(bx)取余加30h 得ascii 码
s: div bx
add dx,30h
mov [si],dl ;将asc2 送入内存 ds:[si]
mov cx,ax ;将商赋给cx cx<>0 继续循环
jcxz ret0 ;cx=0 则跳转到标号处
inc si ;(si)=(si)+1 偏移地址指向下内存单元
sub dx,dx ;dx=dx-dx 初始化dx dx+ax组成新的16
;位被除数
jmp short s
ret0: pop di ;出栈各个寄存器的数据
pop dx
pop cx
pop bx
ret ;返回
show_str: push ax ;压栈各个寄存器的数据
push bx
push cx
push dx
push si
push di
push es
mov ax,0b800h ;初始化显存段地址
mov es,ax
mov al,160 ;al*dh+dl 得出显存的偏移地址
inc dh ;行号是从0开始所以8行应该是8+1
mul dh
sub dh,dh
add dx,dx
add ax,dx
mov di,ax ;将偏移地址赋给di
mov ss:[0],cl ;将属性送入到内存
s1: mov al,[si] ;将内存ds:[si]单元内的数据送入al
mov ah,ss:[0] ;将内存ss:[0]单元中存放的属性送入
ah
mov es:[di],ax ;将(ax)送入显存es:[di]
mov cx,si ;将si的偏移地址赋给cx cx<>0 继续
;循环 否则跳转到标号
jcxz ret1
dec si ; (si)=(si)-1
add di,2 ;(di)=(di)+2
jmp short s1
ret1: pop es ; 出栈
pop di
pop si
pop dx
pop cx
pop bx
pop ax
ret assume cs:code
data segment
db 10 dup (0)
data ends
stack segment
db 32 (0)
stack ends
code segment
start: mov ax,12666
mov bx,data ;初始化数据段
mov ds,bx
sub si,si
mov bx,stack ;初始化栈
mov ss,bx
mov sp,32
call dtoc ;调用子列程 dtoc 算出十进制的ascii码
mov dh,8 ;设置 行 列 属性
mov dl,3
mov cl,2
call show_str ;调用子列程 show_str 显示字符串
mov ax,4c00h ;程序返回
int 21h
dtoc: push bx ;压栈寄存器中的数据
push cx
push dx
push di
mov bx,0ah ;参数除(bx)取余加30h 得ascii 码
s: div bx
add dx,30h
mov [si],dl ;将asc2 送入内存 ds:[si]
mov cx,ax ;将商赋给cx cx<>0 继续循环
jcxz ret0 ;cx=0 则跳转到标号处
inc si ;(si)=(si)+1 偏移地址指向下内存单元
sub dx,dx ;dx=dx-dx 初始化dx dx+ax组成新的16
;位被除数
jmp short s
ret0: pop di ;出栈各个寄存器的数据
pop dx
pop cx
pop bx
ret ;返回
show_str: push ax ;压栈各个寄存器的数据
push bx
push cx
push dx
push si
push di
push es
mov ax,0b800h ;初始化显存段地址
mov es,ax
mov al,160 ;al*dh+dl 得出显存的偏移地址
inc dh ;行号是从0开始所以8行应该是8+1
mul dh
sub dh,dh
add dx,dx
add ax,dx
mov di,ax ;将偏移地址赋给di
mov ss:[0],cl ;将属性送入到内存
s1: mov al,[si] ;将内存ds:[si]单元内的数据送入al
mov ah,ss:[0] ;将内存ss:[0]单元中存放的属性送入
ah
mov es:[di],ax ;将(ax)送入显存es:[di]
mov cx,si ;将si的偏移地址赋给cx cx<>0 继续
;循环 否则跳转到标号
jcxz ret1
dec si ; (si)=(si)-1
add di,2 ;(di)=(di)+2
jmp short s1
ret1: pop es ; 出栈
pop di
pop si
pop dx
pop cx
pop bx
pop ax
ret
code ends
end start | | |