鱼C论坛

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

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

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

data segment

        db 'Weloome to Masm!'
        db 02h,24h,71h
        
data ends

stack segment

        dd 8 dup (0)
        
stack ends 

code segment 

start:    mov ax,data
        mov ds,ax
        mov ax,stack
        mov ss,ax
        mov sp,16h
        mov ax,0b872h
        mov es,ax
        
        mov cx,3
s:        push cx
        
        mov cx,16
s1:        mov al,ds:[bx]
        mov es:[bp],al
        inc bx
        add bp,2
        loop s1
        
        sub bp,bp
        sub bx,bx
        
        mov cx,16
s2:        mov al,ds:10h[di]
        mov es:[bp+1],al
        add bp,2
        loop s2
        
        inc di
        add bp,0ah
        
        pop cx
        loop s
        
        mov ax,4c00h
        int 21h
        
code ends

end start
           
           


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

评分

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

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2013-12-14 18:31:32 | 显示全部楼层
我的也是那样,有时候能显示出来
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

使用道具 举报

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

使用道具 举报

发表于 2013-12-15 18:47:03 | 显示全部楼层
在Loop S后面插入一条 Jmp $或者是jmp start
这样就可以防止程序执行完毕就退出了!
还有一种,使用键盘中断int 16h 强烈推介!
这3中都是一句话,夹在Loop S后面
详细代码如下:
assume cs:data,ds:data,ss:stack
data segment
        db 'Weloome to Masm!'        db 02h,24h,71h        data ends
stack segment
        dd 8 dup (0)        stack ends 
code segment 
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
end start
第二种方法:跳转到头部!
assume cs:data,ds:data,ss:stack

data segment

        db 'Weloome to Masm!'
        db 02h,24h,71h

data ends

stack segment

        dd 8 dup (0)

stack ends 

code segment 

start:    mov ax,data
        mov ds,ax
        mov ax,stack
        mov ss,ax
        mov sp,16h
        mov ax,0b872h
        mov es,ax

        mov cx,3
s:        push cx

        mov cx,16
s1:        mov al,ds:[bx]
        mov es:[bp],al
        inc bx
        add bp,2
        loop s1

        sub bp,bp
        sub bx,bx

        mov cx,16
s2:        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 start
        mov ax,4c00h
        int 21h

code ends

end start

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

data segment

        db 'Weloome to Masm!'
        db 02h,24h,71h

data ends

stack segment

        dd 8 dup (0)

stack ends 

code segment 

start:    mov ax,data
        mov ds,ax
        mov ax,stack
        mov ss,ax
        mov sp,16h
        mov ax,0b872h
        mov es,ax

        mov cx,3
s:        push cx

        mov cx,16
s1:        mov al,ds:[bx]
        mov es:[bp],al
        inc bx
        add bp,2
        loop s1

        sub bp,bp
        sub bx,bx

        mov cx,16
s2:        mov al,ds:10h[di]
        mov es:[bp+1],al
        add bp,2
        loop s2

        inc di
        add bp,0ah

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

code ends

end start

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

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

你试式不用调试器执行呀!这样照样不行!
想知道小甲鱼最近在做啥?请访问 -> 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
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-18 16:32

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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