鱼C论坛

 找回密码
 立即注册
查看: 1764|回复: 9

请哪位帮忙回答一下关于编译成的exe文件在cmd下运行的问题

[复制链接]
发表于 2012-12-13 21:05:18 | 显示全部楼层 |阅读模式
5鱼币
本帖最后由 雪绒★~花飘 于 2012-12-18 16:03 编辑

52{S8(57V1ND{7@2HJFN[JA.jpg 之前发了一个关于这个问题,但好像是自己没表达好,大家都理解错了,现在上图来说一下,情况是我这个本本编译好一个exe文件后,就比如小甲鱼老师第十五章那里外中断那里,小甲鱼老师那个编译好的exe文件在cmd下运行会依次出现a到z的变化过程,就想第一张图那样在中间那里会出现字母。而我这个编译好的exe文件在cmd下运行却不会出现字母(跟代码没有关系,前面的所有exe文件运行都没有东西),就如下面第二章图一样 M)G[OV_LY{C)8JH35N2[O0K.jpg 只是运行了一段时间跳出就回到cmd下不会在中间显示字母,每次都看不到效果,只能debug单步跟踪(debug单步跟踪可以显示出效果)。这个会是操作系统或别的什么原因吗???

最佳答案

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2012-12-13 21:05:19 | 显示全部楼层
assume cs:code
stack segment
      db 128 dup (0)
stack ends

code segment 
start:
                        mov ax,stack

                        mov ss,ax               ;mov es,ax



                        mov ax,0b800h     ;这个是显存的段地址,你懂的!
                        mov di,160*12+20*2 
                        mov es,ax


                        mov ah,'a'
                        mov al,02h                      ;加了个颜色上


s:               mov es:[di],ah        ;加上上面的段地址定义,就可以显示了
                        mov es:[di+1],al
                        call delay
                        inc ah
                        add di,2                          ;将a到z26个字母全部显示出来
          cmp ah, 'z'
                        jna s

                        mov ax,4c00h
                        int 21h

delay:                 push ax
                        push dx
                        mov dx,1000h
                        mov ax,0


s1:             sub ax,1
                        sbb dx,0
                        cmp ax,0
                        jne s1
                        cmp dx,0
                        jne s1
                        pop dx
                        pop ax
                        ret

code ends
end start ;以上,是我根据楼主的代码改的,你原来代码功参是在显存的同个字节位上依次显示a 到 z ,我改成将a 到 z 全部显示出来。这个例子我没有看到过,我现在才学到13章int 指令。共同学习,大牛勿喷!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2012-12-14 08:24:40 | 显示全部楼层
怎么看不到,是不能执行吗?还是一闪而过。。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2012-12-14 22:11:35 | 显示全部楼层
start:
   mov ax,stack
   mov es,ax
你这边是不是错了啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2012-12-15 08:57:41 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2012-12-15 08:58:24 | 显示全部楼层
ycg 发表于 2012-12-14 22:11
start:
   mov ax,stack
   mov es,ax

没错啊我重书上抄下来的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2012-12-15 09:00:47 | 显示全部楼层
雪绒★~花飘 发表于 2012-12-15 08:57
恩一闪而过没有重 a到z的过程

在cmd下运行了一段时间但看不到运行的结果,没有显示任何东西,然后又返回了cmd
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2012-12-17 15:51:16 | 显示全部楼层
雪绒★~花飘 发表于 2012-12-15 08:58
没错啊我重书上抄下来的

应该这样吧:
mov ax,stack
mov ss,ax
mov ax,0b800h
mov es,ax
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2012-12-17 23:27:49 | 显示全部楼层
楼主,你指定是把代码打错了。鱼C的教程中没有这个。那个stack应该是栈段,是传送给SS段的,不是ES段吧。
assume cs:code
stack segment
      db 128 dup (0)
stack ends

code segment
start:
           mov ax,stack
          mov ss,ax               ;mov es,ax

         mov ax,0b800h     ;这个是显存的段地址,你懂的!有了它,才会在显示器上依次显示a到z
                                      ;我的也是本本,跟楼主一样,不会显示,可能跟显卡有关吧,我装了虚拟机跑XP,测试通过。
         mov es,ax

          mov ah,'a'

s:       mov es:[160*12+40*2],ah        ;加上上面的段地址定义,就可以显示了
         call delay
          inc ah
          cmp ah, 'z'
          jna s
  
         mov ax,4c00h
         int 21h

delay:  push ax
           push dx
           mov dx,1000h
           mov ax,0

s1:     sub ax,1
          sbb dx,0
          cmp ax,0
          jne s1
          cmp dx,0
          jne s1
          pop dx
          pop ax
         ret
  
code ends
end start
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2012-12-18 17:41:06 | 显示全部楼层
可能跟CPU寻址方式和内存分配有关吧,不清楚,只有请大牛帮忙解释一下了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2024-10-8 00:28

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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