鱼C论坛

 找回密码
 立即注册
查看: 2110|回复: 3

实验十第一题,运行起来怎么没有在dos提示终端显示出来啊

[复制链接]
发表于 2012-2-25 12:15:35 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
实验十第一题,运行起来怎么没有在dos提示终端显示出来啊
我实验了好多遍,而且调试的时候发现在在显存中并没有写入要显示的字符和其属性,这是为什么呢,求哪位大侠告诉我啥。我的代码如下:
  1. assume cs:code

  2. data segment
  3.   db 'Welcome to masm!',0
  4. data ends

  5. code segment
  6. start:
  7.       mov dh,8
  8.           mov dl,3
  9.           mov cl,2
  10.           
  11.           mov ax,data
  12.           mov ds,ax
  13.           mov si,0
  14.           call show_str
  15.           
  16.           
  17.           mov ax,4c00h
  18.           int 21h
  19.           
  20. show_str:
  21.         push cx
  22.                 push si
  23.                 dec dh
  24.                 mov al,0A0h ;一行2*80=160字节
  25.                 mul dh
  26.                
  27.                 mov bx,ax ;保存行偏移地址
  28.                 mov al,2  ;一个字符两个字节
  29.                 mul dl
  30.                 sub ax,2
  31.                
  32.                 add bx,ax
  33.                 mov ax,0B800h
  34.                 mov es,ax
  35.                
  36.                 mov al,cl ;保存字符属性值
  37.                 mov di,0  ;指向显存的偏移地址
  38.                 mov ch,0
  39.         s:        mov cl,ds:[si]
  40.                
  41.                 jcxz ok
  42.                 mov es:[bx+di],cl
  43.                 mov es:[bx+di+1],al
  44.                
  45.                 inc si
  46.                 add di,2
  47.                 jmp short s
  48. ok:
  49.     pop si
  50.         pop cx
  51.         ret
  52.                
  53.                
  54. code ends
  55. end start
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
 楼主| 发表于 2012-2-25 12:16:09 | 显示全部楼层
:(:(:(:(,自己先顶一下
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
 楼主| 发表于 2012-2-25 12:50:28 | 显示全部楼层
知道原因了,不好意思,原来是因为windows7上的dos终端显示不了:lol:lol:lol:lol:lol:lol:lol
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2012-2-25 13:30:19 | 显示全部楼层
值得顶一下,你的程序没有错误,执行得非常好!
在文件夹内直接输入***.exe就行了
之所以你说没有在dos提示终端显示出来,是因为你一直在单步运行的原因。
例如:当ip指向代码“mov es:[bx+di],cl”时,你摁“t”单步执行
我们来看CPU执行过程:读取指令“mov es:[bx+di],cl”,ip=ip+3,执行指令“mov es:[bx+di],cl”,然后 es:[bx+di]中的值变成了cl中的值,这是肯定的。但关键是下一步,你会说CPU下一步该读取执行你的“es:[bx+di+1],al”指令,但其实不是,CPU下一步真正执行的是你按的“T”命令的后续内容——显示当前各寄存器状态、显示下一条指令的内容,屏幕上的原字符往上移动……,可以说整屏的显存中数据都做了变动了。所以你再用D命令查看显存,就看不到你之前赋的CL的值,而是D命令执行前屏幕上的字符属性,每次用D查看显存,都会看到它代表字符的单元都在变化,只有代表颜色属性的单元始终是“07”,也就是黑底白字。

以上都是经过试验和思考得出的个人结论,若有错误的地方,请高手们一定要指出来啊!!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-5-2 03:03

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表