|
发表于 2020-11-14 21:28:27
|
显示全部楼层
assume cs:code,ds:data,ss:stack
data segment
dw 123,12666,1,8,3,0
db 40 dup(0)
data ends
stack segment
dw 16 dup(0)
stack ends
code segment
start:mov ax,data
mov ds,ax ;数据初始化
mov ax,stack
mov ss,ax
mov sp,32 ;栈初始化
mov si,0
call far ptr dtoc
mov si,12
mov dh,11
mov dl,32
mov cl,04h ;定义函数的输入值
call show_str
mov ax,4c00H
int 21h
show_str: ;显示字符串子程序
mov ch,0
push cx ;将cl的数据放入栈中
mov ax,0b800h
mov es,ax ;用es保存显示缓冲区的地址
mov al,160
mul dh
mov bx,ax ;行结果放到bx中
mov al,2
mul dl
add bx,ax ;行与列放到bx中
pop dx ;pop必须写到循环外边
s:mov cl,ds:[si] ;为了与下面的jcxz配合当cx为0时跳出
jcxz ok
mov ah,[si]
mov es:[bx],ah
mov es:[bx+1],dl
inc si
add bx,2
jmp s
ok:ret
divdw: ;防溢出除法程序
push ax
mov ax,dx
mov dx,0
div cx
mov bx,ax
pop ax
div cx
mov cx,dx
mov dx,bx
ret
dtoc: ;数值显示
mov di,12 ;定位余数的内存空间
b: mov dx,0
mov ax,ds:[si] ;将所要转换的数放入ax
mov cx,ax
jcxz cde ;此次是为了判断要转换的数是否为零
mov bp,-1 ;为了确定数字长度
sss:
mov cx,10 ;设置除数
call divdw
push cx
inc bp
inc cx ;这个inc cx是关键因为loop运算时,先
;会进行cx-1操作
loop sss
pop cx ;将最后入栈的0出栈
mov cx,bp
a: ;将入栈的数据放到内存中
pop dx
add dl,30h
mov ds:[di],dl
inc di
loop a
add si,2 ;为下一个数据初始化
mov bp,20h
mov ds:[di],bp
inc di
jmp b
cde: retf ;为0则直接跳出
code ends
end start |
|