显示的问题

yxlovemoney 2009-04-27 04:48:00
程序,是把数字12666转换成“12666”,然后放到 data段中
然后再放到显示缓冲区把其显示出来,
现在不明白的是,DEBUG下执行的话,字符就是一个个地显示出来,
如果在命令行下,比如c:\masm>1.exe 运行这个程序的话,就是整个字符串显示出来,这个是为什么呢?

assume cs:code,ss:stack
data segment
db 10 dup (0)
data ends
stack segment
dw 10 dup (0)
stack ends

code segment
start:mov ax,12666 ;要显示的数字
mov bx,data
mov ds,bx;取得存放数据的地址

mov bx,stack
mov ss,bx
mov sp,14h ;指向分配的栈
mov si,0
mov di,0
call dtoc ;调用数字转换子程序

mov dh,8 ;显示字符串的位置和样式
mov dl,3
mov cl,2
call show_str

mov ax,4c00h ;0019
int 21h

dtoc:mov bx,10 ;bx作为除数
rem:mov dx,0 ;dx每次要清空,否则会影响结果
div bx
mov cx,ax
push dx ;余数入栈,结果是得出该数字的每一位

inc si ;计算有多少个字
jcxz exit
jmp short rem
exit:mov cx,si ;取得循环数
p:pop bx ;将数取出
add bl,30H ;转换了数字对应的字符
mov [di],bl ;字符赋到相应地址
inc di
loop p

ret ;返回到call下一地址



show_str:mov si,0
dec dh
mov al,0A0H
mul dh ;乘法

dec dl ;先减1才能正确指定位置
mov dh,0
add ax,dx ;得到文字显示地址

mov bp,ax ;偏移地址送入bp
mov ax,0b800h
mov es,ax ;将显示缓冲区段地址送入es

mov bx,0
mov di,0
s:push cx ;将cl中的样式入栈
mov ah,cl ;取得样式 高位
mov al,[bx+di] ;字符串一个个字符赋值 低位
mov es:[bp+si],ax ;字符和样式送入显示缓冲区

mov ch,0
mov cl,al ;将字符放到CX中,遇到0则跳出循环
inc di
add si,2

jcxz back
pop cx ;将样式取出
jmp short s

back:pop cx
ret

code ends
end start
...全文
78 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
nanlingcg 2009-04-27
  • 打赏
  • 举报
回复
程序正确。要想显示时能看清,要加段延时程序代码。。。王师傅的书上有。。。
rqshi0315 2009-04-27
  • 打赏
  • 举报
回复
因为debug 可以单步调试,这样字符就一个一个显示了。
直接执行的话,程序一下在执行完了,根本看不出是一个一个显示出来的。实际上是一个一个显示出来的。
pla_007 2009-04-27
  • 打赏
  • 举报
回复
如果想按一个键显示一个字符的话,可以在jmp short s前面加2条指令(等待键盘输入):



mov ah,0
int 16h


21,500

社区成员

发帖
与我相关
我的任务
社区描述
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
社区管理员
  • 汇编语言
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧