马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
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
|