鱼C论坛

 找回密码
 立即注册
查看: 4115|回复: 7

关于实验九,程序可以执行,但是一闪而过都不知道结果正不正确

[复制链接]
发表于 2013-12-14 16:44:37 | 显示全部楼层 |阅读模式
1鱼币
本帖最后由 Sen哥 于 2013-12-14 21:42 编辑

  1. assume cs:data,ds:data,ss:stack

  2. data segment

  3.         db 'Weloome to Masm!'
  4.         db 02h,24h,71h
  5.         
  6. data ends

  7. stack segment

  8.         dd 8 dup (0)
  9.         
  10. stack ends

  11. code segment

  12. start:    mov ax,data
  13.         mov ds,ax
  14.         mov ax,stack
  15.         mov ss,ax
  16.         mov sp,16h
  17.         mov ax,0b872h
  18.         mov es,ax
  19.         
  20.         mov cx,3
  21. s:        push cx
  22.         
  23.         mov cx,16
  24. s1:        mov al,ds:[bx]
  25.         mov es:[bp],al
  26.         inc bx
  27.         add bp,2
  28.         loop s1
  29.         
  30.         sub bp,bp
  31.         sub bx,bx
  32.         
  33.         mov cx,16
  34. s2:        mov al,ds:10h[di]
  35.         mov es:[bp+1],al
  36.         add bp,2
  37.         loop s2
  38.         
  39.         inc di
  40.         add bp,0ah
  41.         
  42.         pop cx
  43.         loop s
  44.         
  45.         mov ax,4c00h
  46.         int 21h
  47.         
  48. code ends

  49. end start
  50.            
  51.            
复制代码



上面是源码,很蠢的方法,cmd运行很快返回了,看不到结果,求大神帮我看看我的代码哪里错了,谢谢!

评分

参与人数 1鱼币 +1 收起 理由
无名侠 + 1 直接跳到5楼查看把!

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2013-12-14 18:31:32 | 显示全部楼层
我的也是那样,有时候能显示出来
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2013-12-14 23:00:28 | 显示全部楼层
没事了,知道什么回事了,当你不知道自己哪里错了,强烈推荐使用Emu8086软件,功能强大
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2013-12-15 11:57:20 | 显示全部楼层
如果你想让它在桌面停留一下,你可以在最后插入这个语句sysdem("pause");这样它就会停留在桌面,然后按任意键继续。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2013-12-15 18:47:03 | 显示全部楼层
在Loop S后面插入一条 Jmp $或者是jmp start
这样就可以防止程序执行完毕就退出了!
还有一种,使用键盘中断int 16h 强烈推介!
这3中都是一句话,夹在Loop S后面
详细代码如下:
  1. assume cs:data,ds:data,ss:stack
  2. data segment
  3.         db 'Weloome to Masm!'        db 02h,24h,71h        data ends
  4. stack segment
  5.         dd 8 dup (0)        stack ends
  6. code segment
  7. start:    mov ax,data        mov ds,ax        mov ax,stack        mov ss,ax        mov sp,16h        mov ax,0b872h        mov es,ax                mov cx,3s:        push cx                mov cx,16s1:        mov al,ds:[bx]        mov es:[bp],al        inc bx        add bp,2        loop s1                sub bp,bp        sub bx,bx                mov cx,16s2:        mov al,ds:10h[di]        mov es:[bp+1],al        add bp,2        loop s2                inc di        add bp,0ah                pop cx        loop s        jmp [        DISCUZ_CODE_22        ]nbsp;       mov ax,4c00h        int 21h        code ends
  8. end start
复制代码
第二种方法:跳转到头部!
  1. assume cs:data,ds:data,ss:stack

  2. data segment

  3.         db 'Weloome to Masm!'
  4.         db 02h,24h,71h

  5. data ends

  6. stack segment

  7.         dd 8 dup (0)

  8. stack ends

  9. code segment

  10. start:    mov ax,data
  11.         mov ds,ax
  12.         mov ax,stack
  13.         mov ss,ax
  14.         mov sp,16h
  15.         mov ax,0b872h
  16.         mov es,ax

  17.         mov cx,3
  18. s:        push cx

  19.         mov cx,16
  20. s1:        mov al,ds:[bx]
  21.         mov es:[bp],al
  22.         inc bx
  23.         add bp,2
  24.         loop s1

  25.         sub bp,bp
  26.         sub bx,bx

  27.         mov cx,16
  28. s2:        mov al,ds:10h[di]
  29.         mov es:[bp+1],al
  30.         add bp,2
  31.         loop s2

  32.         inc di
  33.         add bp,0ah

  34.         pop cx
  35.         loop s
  36.         jmp start
  37.         mov ax,4c00h
  38.         int 21h

  39. code ends

  40. end start
复制代码


第三种方法:相当于C语言的Getchar();
  1. assume cs:data,ds:data,ss:stack

  2. data segment

  3.         db 'Weloome to Masm!'
  4.         db 02h,24h,71h

  5. data ends

  6. stack segment

  7.         dd 8 dup (0)

  8. stack ends

  9. code segment

  10. start:    mov ax,data
  11.         mov ds,ax
  12.         mov ax,stack
  13.         mov ss,ax
  14.         mov sp,16h
  15.         mov ax,0b872h
  16.         mov es,ax

  17.         mov cx,3
  18. s:        push cx

  19.         mov cx,16
  20. s1:        mov al,ds:[bx]
  21.         mov es:[bp],al
  22.         inc bx
  23.         add bp,2
  24.         loop s1

  25.         sub bp,bp
  26.         sub bx,bx

  27.         mov cx,16
  28. s2:        mov al,ds:10h[di]
  29.         mov es:[bp+1],al
  30.         add bp,2
  31.         loop s2

  32.         inc di
  33.         add bp,0ah

  34.         pop cx
  35.         loop s
  36.         int 16h ;16号键盘中断,按下任意键后才会继续往下执行!这样就起到了暂停作用,强烈推介使用这种方法!在书的最后一章有介绍!
  37.         mov ax,4c00h
  38.         int 21h

  39. code ends

  40. end start
复制代码


           求最佳! 不懂的可以加我QQ:1447380573

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2013-12-15 19:01:48 | 显示全部楼层

你试式不用调试器执行呀!这样照样不行!
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2013-12-15 19:46:16 | 显示全部楼层
/se陈愉鑫/se 发表于 2013-12-15 19:01
你试式不用调试器执行呀!这样照样不行!

是那个显示彩色字符串的实验吗,是的话,你是在什么操作系统上运行的啊,win7是不能显示出结果的;我的机器在win7上不能显示结果,我在虚拟机的xp上运行,结果显示正常
下面是自己的代码,与鱼老师的不太一样


;需要说明的是,王爽老师这本书的这个例子,好像不能在win下运行
;我是在虚拟机上装了xp来运行它的,显示正常,而在win7下,我的机器是显示不出什么的

assume cs:code,ds:data
;数据段
data segment
        db 'hello my world!'
        db 02h,24h,71h ;偏移位15
        dw 0b872h,0b87ch,0b886h  ;代表11行,12行,13行的中间位置(显示字符串的地方)
                                                         ;偏移为18       
data ends
;代码段
code segment
start:       
        mov ax,data
        mov ds,ax
       
        ;初始化
        mov bx,0 ;来定位输出的位置
        mov bp,0 ;来定位输出的属性
        mov cx,3 ;外循环三次,即将’hello my world!‘以3中不同的属性输出3次(不同位置输出)
s1:
        mov ax,ds:[bx+18]  
        mov es, ax
       
        push cx ;保存外循环的值
        mov si,0 ;原字符串
        mov di,0 ;目标地址       
        mov cx,15  ;内循环,主要是输出15个字符’hello my world!‘
  s2:
        ;填写ascII
        mov al,ds:[si]
        mov es:[di],al
       
        ;设置属性
        mov al,ds:[bp+15]
        mov es:[di+1],al
       
        inc si  
        add di,2
   loop s2 ;进入内循环的下一次循环
       
        add bx,2
        inc bp
        pop cx
loop s1 ;进入外循环的下一次循环
       
        mov ax,4c00h
        int 21h
code ends
        end start
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2014-11-26 12:48:39 | 显示全部楼层
刚刚浏览了大神们的回答,他们说在win32系统下需要在debug下运行-g命令,不知道是不是这样!
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-7-3 22:21

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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