王爽汇编语言第二版,实验十代码运行问题

代码如下:

;实验10   编写三个子程序,后面将会用到

data segment
db '1343555343543suadyhalshdasdh',0
data ends
stack segment
dw  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
stack ends

code segment
assume cs:code,ds:data

;1.显示字符串
;名称:show_str
;功能:在指定的位置,用指定的颜色,显示一个用0结束的字符串
;参数:dh = 行号 ,范围0~24 . dl = 列号,范围0~79
;      cl = 颜色,ds:si指向字符串首地址
;返回: 无
show_str:
push dx
push cx
push ds
push si ;保存数据

mov bx,0b800h
mov es,bx
mov al,160
mul dh
mov di,ax
mov dh,0 
add di,dx        ;第一个字母显示的位置

mov al,cl        ;保存颜色
show_str_s:
mov bl,[si]
mov cl,bl
mov ch,0
jcxz show_str_end
mov bh,al
mov es:[di],bx

inc si 
add di,2 
jmp show_str_s

show_str_end:
pop si  ;恢复数据
pop ds 
pop cx 
pop dx 
ret

;2.解决除法溢出
;名称:divdw
;功能:进行不会产生除法溢出的除法运算,被除数为dword型,除数为word型,结果为dword型
;参数:ax = dword的低16位    dx = dword的高16位     cx = 余数
;结果:dx = 结果的高16位         ax = 结果的低16位      cx = 余数
divdw:
push si
push di

mov di,ax          ;保存低16位的值
mov ax,dx
mov dx,0
div cx            ;此时ax中为商,dx中为余数;两个都是我们需要的数,但因为余数位置就在dx,所以我们只需要保存ax

mov si,ax

mov ax,di
div cx 

mov cx,dx 
mov dx,si

pop di 
pop si 
ret

;3.数值显示
;名称:dtoc
;功能:将word型数据变为表示10进制数的字符串,字符串以0为结尾符
;参数:ax = word型数据     ds:si指向字符串首地址
;返回:无
dtoc:
push ax 
push cx 
push dx 
push si 
push bx 
push di

mov di,0    ;记录位数
mov bx,10   ;作为除数
dtoc_s:
div bx      ;ax中为商,dx为余数
mov cx,ax 
jcxz dtoc_end
add dx,30h     ;将余数变为对应的字符
push dx        ;入栈
inc di
mov dx,0        ;
inc si 
jmp dtoc_s
dtoc_end:
;商为0时的最后一个余数的显示
add dx,30h
push dx 
inc di 

mov si,0 
mov cx,di 
dtoc_s2:
pop dx 
mov [si],dl 
inc si 
loop dtoc_s2
mov byte ptr [si],0

mov dh,20
mov dl,40
mov cl,10100100b
mov si,0
call show_str   

pop di 
pop bx 
pop si 
pop dx 
pop cx 
pop ax 
ret

start:
mov ax,stack
mov ss,ax
mov sp,32

mov ax,data
mov ds,ax
mov si,0

;mov dh,20
;mov dl,40
;mov cl,10100100b

;call show_str

;mov ax,4240h
;mov dx,000fh
;mov cx,0ah
;call divdw

mov ax,12345

call dtoc

mov ah,4ch
int 21h
code ends
end start

问题是:用debug加载exe文件,然后直接用 g 命令可以得到想要的结果,但是直接在dos下加载就不行,直接在dos下加载就会没反应,卡死

img