鱼C论坛

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

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

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

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

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

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

 

data segment

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

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

data ends

 

stack segment

        dw 8 dup(0)

stack ends

 

code segment

start:

        mov ax,data

        mov ds,ax

        mov ax,stack

        mov ss,ax

        mov sp,10h

        mov bx,0

        mov di,0

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

 

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

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

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

        push di

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

        mov si,0

        mov di,0

 

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

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

        mov es:[bx+di],al

        inc si

        add di,2

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

        

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

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

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

 

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

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

        add si,2

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

        

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

        inc di

        pop ax

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

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

        pop cx

 

        loop s3

        

        mov ax,4c00h

        int 21h

 

code ends

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-11-19 16:36

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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