雪绒★~花飘 发表于 2012-12-13 21:05:18

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

本帖最后由 雪绒★~花飘 于 2012-12-18 16:03 编辑

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

lyoal 发表于 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:,ah      ;加上上面的段地址定义,就可以显示了
                        mov es:,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 指令。共同学习,大牛勿喷!

username_badboy 发表于 2012-12-14 08:24:40

怎么看不到,是不能执行吗?还是一闪而过。。。

ycg 发表于 2012-12-14 22:11:35

start:
   mov ax,stack
   mov es,ax
你这边是不是错了啊

雪绒★~花飘 发表于 2012-12-15 08:57:41

username_badboy 发表于 2012-12-14 08:24 static/image/common/back.gif
怎么看不到,是不能执行吗?还是一闪而过。。。

恩一闪而过没有重 a到z的过程

雪绒★~花飘 发表于 2012-12-15 08:58:24

ycg 发表于 2012-12-14 22:11 static/image/common/back.gif
start:
   mov ax,stack
   mov es,ax


没错啊我重书上抄下来的

雪绒★~花飘 发表于 2012-12-15 09:00:47

雪绒★~花飘 发表于 2012-12-15 08:57 static/image/common/back.gif
恩一闪而过没有重 a到z的过程

在cmd下运行了一段时间但看不到运行的结果,没有显示任何东西,然后又返回了cmd

ycg 发表于 2012-12-17 15:51:16

雪绒★~花飘 发表于 2012-12-15 08:58 static/image/common/back.gif
没错啊我重书上抄下来的

应该这样吧:
mov ax,stack
mov ss,ax
mov ax,0b800h
mov es,ax

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

lyoal 发表于 2012-12-18 17:41:06

可能跟CPU寻址方式和内存分配有关吧,不清楚,只有请大牛帮忙解释一下了
页: [1]
查看完整版本: 请哪位帮忙回答一下关于编译成的exe文件在cmd下运行的问题