+ -
当前位置:首页 → 问答吧 → 编译生成的EXE点了 还是不能显示字符

编译生成的EXE点了 还是不能显示字符

时间:2011-05-03

来源:互联网

Assembly code
assume cs:code,ds:data 
data    segment 
    db    'welcome to masm!, Please any key to end!',0 
data    ends 

code    segment 
start: 
    mov    ax,data     ;将字符串所在的段送入ds
    mov    ds,ax 

    mov    cl,2         ;设置字符属性
    mov    si,0         ;字符串指针,初始化为0,指向第一个字符
    call    show_str        ;调用显示字符串子函数
     call pause
    mov    ah,1        ;等待键入一个字符,以结束程序
    int    21h
    mov    ax,4c00h        ;结束程序
    int    21h 
pause proc near  ;子程序定义(起退出缓冲作用)

jmp short exitbegin

exitstr db 0ah,0dh,'Press any key to exit...$'

exitbegin:

        push ax

        push ds

        push dx

        ;以上3条push指令的作用是保存现场

        mov ax,seg pause ;取子程序名pause所在的段地址

        mov ds,ax

        lea dx,exitstr

        mov ah,9  ;显示字符串exitstr的内容

        int 21h

        mov ah,7 ;等待输入一个[无回显]字符

        int 21h

        pop dx

        pop ds

        pop ax

        ;以上3条pop指令的作用是恢复现场

        ret

pause endp  ;子程序定义结束

show_str: 
    mov    ax,0b800h     ;将视频缓区的段址送入ES
    mov    es,ax

    mov    bx,10*160+25*2    ;行号*160+列号*2 = 在视频缓区中的偏移量
                ;在此处,我选择在第10行,第5列开始显示

    mov    al,cl         ;将属性保存到AL
    mov    cl,0         ;CL未用到,但需要置0
s: 
    mov    ch,ds:[si]     ;将字符存放到CH
    jcxz    ok         ;如果字符值cx = 0,说明字符串结束
    mov    es:[bx],ch     ;将字符存放到屏幕缓冲区
    mov    es:[bx+1],al     ;将属性传到屏幕缓冲区
    add    bx,2         ;移到下一个显示单元
    inc    si         ;字符指针si+1
    jmp    short s     ;继续显示下一个字符
ok:
    ret 
code    ends 
end    start 



这个代码用masm for windows 点运行 他自己弹出的命令行 上显示是正确的,但是无论是点生成的exe 还是用命令行执行这个exe,都是只有那句enter any key....要是不加上面那个 pause 函数 根本就是一点就瞬间消失。
但是下面一个代码却正常的 点生成的exe文件 是显示正常的
Assembly code
SSEG SEGMENT PARA STACK 'stack' 
SSEG ENDS 
   
DSEG SEGMENT                     
   message db 'Hello,world!',13,10,'$'
DSEG ENDS

CSEG SEGMENT
  assume  cs:CSEG , ds:DSEG, es:DSEG, ss:SSEG
  
  MAIN PROC                         
    call INIT 
     
    mov dx, seg message
    mov ds,dx
    mov dx,offset message
    mov ah,9 
    int 21h
    
      call pause ;返回dos之前暂停一下
      
    mov ax, 4c00h ;返回dos 
      int 21h
  MAIN ENDP
  
  INIT PROC ;初始化程序 
      mov ax ,dseg  
    mov ds , ax 
    mov es , ax
    ret    
  INIT ENDP

  pause proc near  ;子程序定义(起退出缓冲作用)
    jmp short exitbegin
    exitstr db 0ah,0dh,'Press any key to exit...$'
    exitbegin:
        push ax
        push ds
        push dx
        ;以上3条push指令的作用是保存现场
        mov ax,seg pause ;取子程序名pause所在的段地址
        mov ds,ax
        lea dx,exitstr
        mov ah,9  ;显示字符串exitstr的内容
        int 21h
        mov ah,7 ;等待输入一个[无回显]字符
        int 21h
        pop dx
        pop ds
        pop ax
        ;以上3条pop指令的作用是恢复现场
        ret
   pause endp  ;子程序定义结束
CSEG ENDS

END MAIN


我想知道 第一个代码为啥生成exe 无法正常显示 请问问题在哪里啊....

作者: yao90928   发布时间: 2011-05-03

我就是想懂 怎么样才能让他生成的exe文件正常显示,我不想老是用masm for windows的运行结果来验证我写的代码对不对 就是想直接看看生成的exe

作者: yao90928   发布时间: 2011-05-03

第二个代码是不是自己的写的。。。刚学王爽的汇编 了解的不多。。
很纳闷 第二个代码的生成的exe 能正常显示

作者: yao90928   发布时间: 2011-05-03