鱼C论坛

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

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

[复制链接]
发表于 2012-12-13 21:05:19 | 显示全部楼层
  1. assume cs:code
  2. stack segment
  3.       db 128 dup (0)
  4. stack ends

  5. code segment
  6. start:
  7.                         mov ax,stack

  8.                         mov ss,ax               ;mov es,ax



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


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


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

  21.                         mov ax,4c00h
  22.                         int 21h

  23. delay:                 push ax
  24.                         push dx
  25.                         mov dx,1000h
  26.                         mov ax,0


  27. s1:             sub ax,1
  28.                         sbb dx,0
  29.                         cmp ax,0
  30.                         jne s1
  31.                         cmp dx,0
  32.                         jne s1
  33.                         pop dx
  34.                         pop ax
  35.                         ret

  36. code ends
  37. end start ;以上,是我根据楼主的代码改的,你原来代码功参是在显存的同个字节位上依次显示a 到 z ,我改成将a 到 z 全部显示出来。这个例子我没有看到过,我现在才学到13章int 指令。共同学习,大牛勿喷!
复制代码

小甲鱼最新课程 -> https://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
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2012-12-18 17:41:06 | 显示全部楼层
可能跟CPU寻址方式和内存分配有关吧,不清楚,只有请大牛帮忙解释一下了
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-10-8 06:19

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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