代码如下:
;实验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下加载就会没反应,卡死