dtoc: ;定义子程序
;名称:dtoc
;功能:将dword型数据转变为表示十进制的字符串,字符串以0为结尾符。
;参数:(ax)=dword型数据的低16位;
; (dx)=dword型数据的高16位;
; ds:si指向字符串首地址。
;返回:无。
push ax
push bx
push cx
push dx
push si ;以上皆为存储主程序中各寄存器的值
mov bx,0 ;将bx置零,用于存储位数
change: mov cx,10d ;设置除数
push bx ;存储程序中bx的值
push ax ;存储低16位dword型数据
mov ax,dx ;将dx高16位数据放入ax
mov dx,0 ;将dx置零
div cx ;计算高16位除法, 结果:ax存放高位商,dx存放余数
mov bx,ax ;存储高16位除法的商
pop ax ;还原低16位数据
div cx ;计算(余数+低16位)除法 结果:ax存放低16位商,dx存放余数
mov cx,dx ;将余数放入cx
mov dx,bx ;将高16位放入dx
pop bx ;还原程序中bx的值
add cx,30h ;转换
push cx ;将转换的值存储在栈中
inc bx ;位数增一
mov cx,ax ;将低位商存储在cx中,给jcxz指令判断商值提供条件
jcxz s0 ;判断低位商值,若为零跳转到s0标号处
jmp change ;转移到change段,进行下一个余数的计算
s0: mov cx,dx ;将高位商存储在cx中,给jcxz指令判断商值提供条件
jcxz deliver ;当低位商和高位商都为零时,将转入deliver段
jmp change ;当高位商不为0时,返回到change段,继续取余
deliver:mov cx,bx ;将位数送入cx中,为loop指令提供循环计数。
s: pop dx ;取出字符
mov [si],dl ;将字符送入数据段
inc si ;指向下一单元
loop s ;当cx为0时,停止循环
mov byte ptr [si],0 ;设置结尾符0
pop si
pop dx
pop cx
pop bx
pop ax ;以上皆为恢复主程序中各寄存器的值
ret ;定义结束
show_str: ;定义子程序
;名称:show_str
;功能:在指定的位置,用指定的颜色,显示一个用0结束的字符串。
;参数:(dh)=行号(取值范围0~24),(dl)=列号(取值范围0~79),(cl)=颜色,ds:si指向字符串的首地址
;返回:无
push cx
push es
push dx
push si
push di ;以上皆为保存主程序各寄存器的值
mov ax,0b800h
mov es,ax ;设置显存段地址
dec dh ;行号在显存中,从0开始,所以减1
mov al,0a0h ;每行字节数
mul dh ;计算行
push ax ;保存计算结果
mov al,2 ;一个字符有两个字节
mul dl ;计算列
sub ax,2 ;列号在显存中从0开始标号,又因为字符存在偶数中,所以减2
pop di ;将行的计算结果送入di中
add di,ax ;首字符,行列结果存在寻址寄存器中
mov al,cl ;将字符属性存放到al中,
show: mov cl,[si] ;将字符存放在cl中
mov ch,0 ;为jcxz判断字符提供条件
jcxz ok ;判断0
mov ch,al ;将字符属性放到ch中
mov es:[di],cx ;将字符和字符属性送到所指显存中
inc si
add di,2
jmp short show ;循环到show
ok: pop di
pop si
pop dx
pop es
pop cx ;以上皆还原各寄存器数据
ret ;定义结束
code ends
end start
- [kanwangxue] 如果是文字的,不是特别好啊,体力活,如果文字还加点动画,那就必须顶了。 01/15 01:10
- [kanwangxue] 必须顶啊。 01/15 00:54
- [ltoiii] 既然是实现loop功能,是否要考虑s和se标号? mov bx,offset s - offset 12/09 12:09
- [xiaoyao2012] 正确 11/01 15:33
- [xuer2016] 又找到2条被我忽视的地方: 1.PUSH 和 POP 针对字单元 2.POP 不能是CS 10/26 10:57
- [xuer2016] 学习了 我书写不规范,16进制字母前不加0,后面不加H,以后要注意了。。。 10/26 10:51
- [xuer2016] 来老师这学习下 10/26 10:31
- [youthangel] 不妙,CPU的利用率一下子就上去了。还好我的处理器不是太弱,35%左右的利用率。建议博主在修改一下 10/20 08:23
- [fpamc] 在我心里她就是我的女神。 10/02 08:58
- [newpeople] 你女朋友用得了简直就是一个女神…… 10/01 08:10
- [99998888] 请您指点一下如何找到会ASSEMBLER 语言的翻译,翻译成中文或英文。我的QQ ; 9097815 07/25 09:56
- [jeremy] 我觉得你学习的挺好,可以加你扣扣吗?我的469614823 08/07 14:46
- [zhangbo0805] 哈哈, 你好呀!很希望认识你呀!我发现你学习的积极性很高!正想向您学习呢! 07/31 23:31
- [tomato] 知道了,排得还挺满。 05/29 16:35
- [tomato] 现在学习情况怎么样?在做课设二还是什么? 05/29 10:41
- [tomato] 你的留言收到了。 05/05 23:51
- [fpamc] 开始学习c咯! 05/03 21:40
- [fpamc] 居然不能发博客了……! 04/22 21:03
- [tomato] 你相册中的游戏界面我看过了,非常好,界面很漂亮,很有创造力。博主,很有潜力。加油,一定能把这个游戏做 04/20 23:46
- [fpamc] 忙了半个月,不在家,没时间学习汇编。 但是在途中想到了一个有史以来最难的程序。对于刚学完9章的我。 04/13 20:56