|  | 
 
 发表于 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
 | 
 |