laiyihan 发表于 2012-1-6 15:42:37

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

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

seuer126 发表于 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:

      mov es:,al

      inc si

      add di,2

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

      

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

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

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



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

s2:   mov es:,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

laiyihan 发表于 2012-1-6 15:55:54

代码我知道但是不能直接运行exe 可以用G命令直接到mov ax.4c00

seuer126 发表于 2012-1-6 17:08:50

我的可以啊

laiyihan 发表于 2012-1-6 17:31:18

seuer126 发表于 2012-1-6 17:08 static/image/common/back.gif
我的可以啊

http://bbs.fishc.com/data/attachment/album/201201/06/173031u5vvy3cv5vm6yvcv.jpg
我的显示不出来5555:'(

ever.g 发表于 2012-1-6 18:59:34

laiyihan 发表于 2012-1-6 17:31 static/image/common/back.gif
我的显示不出来5555

debug一下这个程序。。。

赵璐 发表于 2012-1-7 00:34:29

我的也是啊在debug中能显示出来但运行exe文件却看不到   运行了二十多次第二次能看到其余都看不到

seuer126 发表于 2012-1-7 09:44:56

赵璐 发表于 2012-1-7 00:34 static/image/common/back.gif
我的也是啊在debug中能显示出来但运行exe文件却看不到   运行了二十多次第二次能看到其余都看不到

不是吧, 难道你的编译器在冬眠,暂时失去功能了。呵呵

小马过河 发表于 2012-1-7 13:21:09

我看没问题,不过BX好像没起什么作用

ytrfamli 发表于 2012-1-7 14:10:48

喔,之前有网友也有类似的问题,当时已经回答过了,再来一次吧.

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

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

在互联网上只有查到,进入程序向显存写入并且马上退出时会看不到结果
(但好像又是因人而异,估计是命令提示符内部关於显示的机制,具体不清楚)

赵璐 发表于 2012-1-7 19:58:44

试了 行了 谢了不纠结了
页: [1]
查看完整版本: 实验9甲鱼老师 是怎么直接运行的呢 为什么我复制它的代码 编译后 也不能直接运行