【8086汇编】这个显示字符串的程序为什么显示不出来?

时间:2022-10-07 21:02:08
assume cs:code,ds:data
data segment
     db 'Hello World!'      ;定义要显示的字符串(共12字节)
data ends

code segment
start:
        mov ax,data
        mov ds,ax           ;ds绑定数据段
       
      
        mov ax,0b872h       ;算出屏幕第12行中间的显存的段起始位置放入ax中
        mov es,ax           ;此时es为屏幕第12行中间的显存的段起始位置
       
        mov si,0            ;初始化寄存器,分别用来控制奇偶地址
        mov di,0
       
        mov cx,0ch          ;第一次循环为0ch次
s1:     mov al,ds:[si]      ;读取单个字符
        mov es:[di],al      ;写到显存里面
        inc si
        add di,2
        loop s1             ;此循环实现偶地址中存放字符
       
        mov si,1            ;si的值设为1,从而为在显存奇地址中存放字符的颜色属性做准备
        mov al,0ah          ;设置颜色属性为绿色高亮
       
        mov cx,0ch          ;第二个循环也为0ch(12)次
s2:     mov es:[si],al
        add si,2
        loop s2             ;此循环实现奇地址中存放字符的颜色属性
       
        ;程序暂停,等待输入
        MOV AH,01H
        INT 21H
       
        mov ax,4c00h
        int 21h
code ends

end start

我用MASM5编译,系统是windows7,在CMD中运行,没有任何反应,什么也不显示,是不是我系统的问题啊?

6 个解决方案

#1


先运行下 debgu 然后 Q 命令退出,再运行你的程序试试?你的程序是直些 dos 文本缓存的,win7 这样的虚拟环境,兼容性表现得就差了些。要么,装个虚拟机吧。

#2


为啥要用俩个循环?ax中, ah放字符属性,al放ascii字符。第一循环一次就可以办的的呀
s1: mov al,[si]
    mov ah,0ah
    mov es:[di],ax 
    inc si
    add di,2
    loop s1 

#3


另外
1,最后下载一个masm 6.1X以上的汇编器。
2,在全屏模式或纯dos模式下运行这个程序

#4


我把源码复制下来在XP 下编译测试了,程序没有问题。

#5


顶一下`~

#6


;楼主:
assume cs:code,ds:data
data segment
  db 'Hello World!$' ;定义要显示的字符串(共12字节)
data ends

code segment
start:
  mov ax,data
  mov ds,ax ;ds绑定数据段
    
    
  mov ax,0b872h ;算出屏幕第12行中间的显存的段起始位置放入ax中
  mov es,ax ;此时es为屏幕第12行中间的显存的段起始位置
    
  mov si,0 ;初始化寄存器,分别用来控制奇偶地址
  mov di,0
    
  mov cx,0ch ;第一次循环为0ch次
s1: mov al,ds:[si] ;读取单个字符
  mov es:[di],al ;写到显存里面
  inc si
  add di,2
  loop s1 ;此循环实现偶地址中存放字符
    
  mov si,1 ;si的值设为1,从而为在显存奇地址中存放字符的颜色属性做准备
  mov al,0ah ;设置颜色属性为绿色高亮
    
  mov cx,0ch ;第二个循环也为0ch(12)次
s2: mov es:[si],al
  add si,2
;这个程序在:汇编语言程序设计实验集成环境(西华师范大学开发)
;可以运行,并显示!

#1


先运行下 debgu 然后 Q 命令退出,再运行你的程序试试?你的程序是直些 dos 文本缓存的,win7 这样的虚拟环境,兼容性表现得就差了些。要么,装个虚拟机吧。

#2


为啥要用俩个循环?ax中, ah放字符属性,al放ascii字符。第一循环一次就可以办的的呀
s1: mov al,[si]
    mov ah,0ah
    mov es:[di],ax 
    inc si
    add di,2
    loop s1 

#3


另外
1,最后下载一个masm 6.1X以上的汇编器。
2,在全屏模式或纯dos模式下运行这个程序

#4


我把源码复制下来在XP 下编译测试了,程序没有问题。

#5


顶一下`~

#6


;楼主:
assume cs:code,ds:data
data segment
  db 'Hello World!$' ;定义要显示的字符串(共12字节)
data ends

code segment
start:
  mov ax,data
  mov ds,ax ;ds绑定数据段
    
    
  mov ax,0b872h ;算出屏幕第12行中间的显存的段起始位置放入ax中
  mov es,ax ;此时es为屏幕第12行中间的显存的段起始位置
    
  mov si,0 ;初始化寄存器,分别用来控制奇偶地址
  mov di,0
    
  mov cx,0ch ;第一次循环为0ch次
s1: mov al,ds:[si] ;读取单个字符
  mov es:[di],al ;写到显存里面
  inc si
  add di,2
  loop s1 ;此循环实现偶地址中存放字符
    
  mov si,1 ;si的值设为1,从而为在显存奇地址中存放字符的颜色属性做准备
  mov al,0ah ;设置颜色属性为绿色高亮
    
  mov cx,0ch ;第二个循环也为0ch(12)次
s2: mov es:[si],al
  add si,2
;这个程序在:汇编语言程序设计实验集成环境(西华师范大学开发)
;可以运行,并显示!