|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
本帖最后由 一只程序猫 于 2023-8-1 14:26 编辑
在debug 用g跳完后正常显示12666
debug
但是直接运行exe不行。
附上源码
- assume cs:code,ss:stack
- data segment
- db 10 dup(0)
- data ends
- stack segment
- db 128 dup(0)
- stack ends
- code segment
- start: mov ax,data
- mov ds,ax
-
-
- mov ax,stack
- mov ss,ax
- mov sp,128
-
- mov si,0
- mov ax,12666
- call dtoc ;取每位的数值并且放到data中
-
- mov dh,16 ;行号
- mov dl,34 ;列号
- mov cl,2 ;颜色
-
- mov si,0
- call show_str ;显示数
-
- mov ax,4c00h
- int 21h
- dtoc: mov cx,10 ;除10取余
- call divdw ;ax不需要动
-
- jcxz begin ;除10取余,直到余数为0
-
- push cx ;颠倒顺序
- inc si ;记录几个数
-
- jmp short dtoc
-
- begin:mov cx,si
- mov si,0
- reversal:pop ax ;存入内存单元中
- add ax,30h ;assic码
- mov ds:[si],al ;防止数据覆盖
- inc si
-
- loop reversal
- ret
- divdw: push ax ;备份下数据
- mov ax,dx
- mov dx,0 ;防止数据溢出
- div cx ; int(H/N)*65536
- mov bx,ax ;商,下面还需要用到dx先保存下
-
- ;dx ;相当于rem(H/N)*65536
- pop ax ;+L
- div cx ;除N
-
- ;ax ;结果的低十六位
- mov cx,dx ;余数
- mov dx,bx ;结果的高十六位
-
- ret
-
-
- show_str:mov ax,0b800h
- mov es,ax
- mov ax,160;一行160字节
- mul dh ;高16位存储在dx,低16位存储在ax中,但是用不到DX,
- ;最大也就是160*24=3840,占一个16位即可
- mov dh,0
- add dl,dl ;三列在这里是用字算的,所有实际是六个字节
-
-
- mov bx,ax ;不习惯用ax来做偏移
- add bx,dx ;列
-
- mov dh,cl ;下面要用到cx所以要换个寄存器放颜色
- ;为什么可以是dh,因为最大的值也就两个字节放的下
-
- mov di,0
- mov ch,0
- extract:mov dl,ds:[di] ;把ds里的数据提出来
-
- mov cl,dl ;检查是否为0
- jcxz show_return
-
- mov es:[bx+si],dx ;显示的值 ;颜色
- add si,2
- inc di
- jmp short extract
-
- show_return:ret
-
- code ends
-
- end start
复制代码 |
|