鱼C论坛

 找回密码
 立即注册
查看: 4057|回复: 10

[争议讨论] 实验9甲鱼老师 是怎么直接运行的呢 为什么我复制它的代码 编译后 也不能直接运行

[复制链接]
发表于 2012-1-6 15:42:37 | 显示全部楼层 |阅读模式

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

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

x
实验9甲鱼老师 是怎么直接运行的呢 为什么我复制它的代码 编译后 也不能直接运行
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2012-1-6 15:48:34 | 显示全部楼层
  1. 下面是参考答案,你在机器上调试下。
  2. assume cs:code,ds:data,ss:stack



  3. data segment

  4.         db 'welcome to masm!'  ;定义要显示的字符串(共16字节)

  5.         db 02h,24h,71h    ;定义三种颜色属性

  6. data ends



  7. stack segment

  8.         dw 8 dup(0)

  9. stack ends



  10. code segment

  11. start:

  12.         mov ax,data

  13.         mov ds,ax

  14.         mov ax,stack

  15.         mov ss,ax

  16.         mov sp,10h

  17.         mov bx,0

  18.         mov di,0

  19.         mov ax,0b872h    ;算出屏幕第12行中间的显存的段起始位置放入ax中



  20.         mov cx,3     ;外循环为3次,因为要显示三个字符串

  21. s3:     push cx        ;三个进栈操作为外循环s3保存相关寄存器的值

  22.         push ax        ;以防止它们的值在内循环中被破坏

  23.         push di

  24.         mov es,ax      ;此时es为屏幕第12行中间的显存的段起始位置

  25.         mov si,0

  26.         mov di,0



  27.         mov cx,10h     ;内循环为10h次,因为一个字符串中含10h个字节

  28. s1:     mov al,ds:[bx+si]

  29.         mov es:[bx+di],al

  30.         inc si

  31.         add di,2

  32.         loop s1      ;此循环实现偶地址中存放字符

  33.         

  34.         mov si,1   ;si的值设为1,从而为在显存奇地址中存放字符的颜色属性做准备

  35.         pop di        ;将di的值恢复成进入内循环之前的时候的值

  36.         mov al,ds:10h[bx+di]    ;取颜色属性[源OP寻址方式:相对基址变址]



  37.         mov cx,10h     ;第二个内循环也为10h次

  38. s2:     mov es:[bx+si],al

  39.         add si,2

  40.         loop s2       ;此循环实现奇地址中存放字符的颜色属性

  41.         

  42.         ;以下4句为下一趟外循环做准备

  43.         inc di

  44.         pop ax

  45.         add ax,0ah   ;将显存的段起始地址设为当前行的下一行

  46.                   ;[在段地址中加0ah,相当于在偏移地址中加了0a0h(=160d)]

  47.         pop cx



  48.         loop s3

  49.         

  50.         mov ax,4c00h

  51.         int 21h



  52. code ends

  53. end start
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
 楼主| 发表于 2012-1-6 15:55:54 | 显示全部楼层
代码我知道  但是不能直接运行exe 可以用G命令直接到mov ax.4c00
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2012-1-6 17:08:50 | 显示全部楼层
我的可以啊
1.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
 楼主| 发表于 2012-1-6 17:31:18 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2012-1-6 18:59:34 | 显示全部楼层
laiyihan 发表于 2012-1-6 17:31
我的显示不出来5555

debug一下这个程序。。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2012-1-7 00:34:29 | 显示全部楼层
我的也是啊  在debug中能显示出来  但运行exe文件却看不到   运行了二十多次第二次能看到其余都看不到
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2012-1-7 09:44:56 | 显示全部楼层
赵璐 发表于 2012-1-7 00:34
我的也是啊  在debug中能显示出来  但运行exe文件却看不到   运行了二十多次第二次能看到其余都看不到

不是吧, 难道你的编译器在冬眠,暂时失去功能了。呵呵
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2012-1-7 13:21:09 | 显示全部楼层
我看没问题,不过BX好像没起什么作用
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2012-1-7 14:10:48 | 显示全部楼层
喔,之前有网友也有类似的问题,当时已经回答过了,再来一次吧.

方法1.
先执行debug(不必指名调试哪个,直接输入debug然後回车)
用q指令退出
执行实验9exe

方法2.
在退出之前调用16h中断的0号功能(等待用户敲下一个按键)
也就是在mov ax,4c00h前面插入以下两行指令
mov ah,0
int 16h
编译後直接运行即可.

在互联网上只有查到,进入程序向显存写入并且马上退出时会看不到结果
(但好像又是因人而异,估计是命令提示符内部关於显示的机制,具体不清楚)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2012-1-7 19:58:44 | 显示全部楼层
试了 行了 谢了  不纠结了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2024-5-1 05:06

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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