Sen哥 发表于 2013-12-14 16:44:37

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

本帖最后由 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:
      mov es:,al
      inc bx
      add bp,2
      loop s1
      
      sub bp,bp
      sub bx,bx
      
      mov cx,16
s2:      mov al,ds:10h
      mov es:,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运行很快返回了,看不到结果,求大神帮我看看我的代码哪里错了,谢谢!

要没时间了 发表于 2013-12-14 18:31:32

我的也是那样,有时候能显示出来

Sen哥 发表于 2013-12-14 23:00:28

没事了,知道什么回事了,当你不知道自己哪里错了,强烈推荐使用Emu8086软件,功能强大

Ez疯 发表于 2013-12-15 11:57:20

如果你想让它在桌面停留一下,你可以在最后插入这个语句sysdem("pause");这样它就会停留在桌面,然后按任意键继续。

无名侠 发表于 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:      mov es:,al      inc bx      add bp,2      loop s1                sub bp,bp      sub bx,bx                mov cx,16s2:      mov al,ds:10h      mov es:,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:
      mov es:,al
      inc bx
      add bp,2
      loop s1

      sub bp,bp
      sub bx,bx

      mov cx,16
s2:      mov al,ds:10h
      mov es:,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:
      mov es:,al
      inc bx
      add bp,2
      loop s1

      sub bp,bp
      sub bx,bx

      mov cx,16
s2:      mov al,ds:10h
      mov es:,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

无名侠 发表于 2013-12-15 19:01:48

Sen哥 发表于 2013-12-14 23:00 static/image/common/back.gif
没事了,知道什么回事了,当你不知道自己哪里错了,强烈推荐使用Emu8086软件,功能强大

你试式不用调试器执行呀!这样照样不行!

狼影 发表于 2013-12-15 19:46:16

/se陈愉鑫/se 发表于 2013-12-15 19:01 static/image/common/back.gif
你试式不用调试器执行呀!这样照样不行!

是那个显示彩色字符串的实验吗,是的话,你是在什么操作系统上运行的啊,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:
        mov es, ax
       
        push cx ;保存外循环的值
        mov si,0 ;原字符串
        mov di,0 ;目标地址       
        mov cx,15;内循环,主要是输出15个字符’hello my world!‘
s2:
        ;填写ascII
        mov al,ds:
        mov es:,al
       
        ;设置属性
        mov al,ds:
        mov es:,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

AIkiller 发表于 2014-11-26 12:48:39

刚刚浏览了大神们的回答,他们说在win32系统下需要在debug下运行-g命令,不知道是不是这样!
页: [1]
查看完整版本: 关于实验九,程序可以执行,但是一闪而过都不知道结果正不正确