汇编语言 第九章 转移指令的原理

本文通过两个实验深入理解汇编语言中的转移指令。实验8分析了一个利用转移指令运行的程序,解释了其工作原理。实验9则要求编程在80×25彩色字符模式下,用不同颜色显示'Welcome to masm!',详细介绍了显示缓冲区的结构和字符属性的设定方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

实验8 分析一个奇怪的程序

分析下面的程序,在运行前思考:这个程序可以正确返回吗?

运行后再思考:为什么是这种结果?

通过这个程序加深对相关内容的理解。

assume cs:codesg

codesg segment

    mov ax,4c00h
    int 21h

start:
    mov ax,0
    
s:
    nop
    nop
   
    mov di,offset s
    mov si,offset s2
    mov ax,cs:[si]
    mov cs:[di],ax

s0:
    jmp short s
   
s1:
    mov ax,0
    int 21h
    mov ax,0

s2:
    jmp short s1
    nop

codesg ends

end start

程序开始执行:

s段代码是将s2的第一段代码复制到s处,ax中的内容是jmp short s1的机器码EBF6,F6的补码是-10,当执行到s0后跳转到s,然后执行EBF6的机器码,也就是向后位移10位,也就是从偏移地址10h向前位移10位,最后程序也就正常结束了。

实验9 根据材料编程

这个编程任务必须在进行下面的课程之前独立完成,因为后面的课程中,需要通过这个实验而获得的编程经验。

编程:在屏幕中间分别显示绿色、绿地红色、白底蓝色的字符串‘Welcome to masm!’。

编程所需的知识通过阅读、分析下面的材料获得。

80×25彩色字符模式显示缓冲区(以下简称为显示缓冲区)的结构:

内存地址空间中,B8000H~BFFFFH共32KB的空间,为80×25彩色字符模式的显示缓冲区。向这个地址空间写入数据,写入的内容将立即显示在显示器上。

在80×25彩色字符模式下,显示器可以显示25行,每行80个字符,每个字符可以有256种属性(背景色、前景色、闪烁、高亮等组合信息)。

这样,一个字符在显示及缓冲区中就要占两个字节,分别存放字符的ASCII码和属性。80×25模式下,一屏的内容在显示缓冲区中共占4000个字节。

显示缓冲区分为8页,每页4KB(≈4000B),显示器可以显示任意一页的内容。一般情况下,显示第0页的内容。也就是说通常情况下,B8000H~B8F9FH中的4000个字节的内容将显示在显示器上。

在一页的显示缓冲区中:

偏移000~09F 对应显示器上的第1行(80个字符占160个字节);
偏移0A0~13F 对应显示器上的第2行;
偏移140~1DF 对应显示器上的第3行。

依此类推,偏移F00~F9F对应显示器上的第25行。

在一行中,一个字符占用两个字节的存储空间(一个字),低位字节存储字符的ASCII码,高位字
节存储字符的属性。一行共有80个字符,占160个字节。

即在一行中:

00~01 单元对应显示器上的第1列。
02~03 单元对应显示器上的第2列。
04~05 单元对应显示器上的第3列。

依此类推,可知,9E~9F单元对应显示器上的第80列。

例如:在显示器的0行0列显示黑底绿色的字符串‘ABCDEF’
(A的ASCII码值为41H,02H表示黑底绿色)

显示缓冲区里的内容为:

           00 01 02 03 04 05 06 07 08 09 0A 0B ... 9E 9F
B800:0000  41 02 42 02 43 02 44 02 45 02 46 02 ... .. ..
:
:
B800:00A0  .. .. .. .. .. .. .. .. .. .. .. .. ... .. ..

可以看出,在显示缓冲区中,偶地址存放字符,奇地址存放字符的颜色属性。

一个在屏幕上显示的字符,具有前景(字符色)和背景(底色)两种颜色,字符还可以以高亮度和
闪烁的方式显示。前景色、背景色、闪烁、高亮等信息被记录在属性字节中。

属性字节的格式:

      7  6 5 4    3  2 1 0
含义  BL R G B    I  R G B
    闪烁  背景 高亮   背景

R: 红色
G: 绿色
B: 蓝色

我们可以按位设置属性字节,从而配出各种不同的前景色和背景色。

比如:红底绿字,属性字节为:01000010B;
      红底闪烁绿字,属性字节为:11000010B;
      红底高亮绿字,属性字节为:01001010B;
      黑底白字,属性字节为:00000111B;
      白底蓝字,属性字节为:01110001B。

例:在显示器的0行0列显示红底高亮闪烁绿色的字符串‘ABCDEF'
(红底高亮闪烁绿色,属性字节为:11001010B,CAH)

显示缓冲区里的内容为:

           00 01 02 03 04 05 06 07 08 09 0A 0B ... 9E 9F
B800:0000  41 CA 42 CA 43 CA 44 CA 45 CA 46 CA ... .. ..
:
:
B800:00A0  .. .. .. .. .. .. .. .. .. .. .. .. ... .. ..

注意,闪烁的效果必须在全屏DOS方式下才能看到。

assume cs:codesg,ds:datasg
 
datasg segment
  db 'welcome to masm!'
datasg ends
 
color segment
  db 00000010B ;黑底绿字
  db 00100100B ;绿底红字
  db 01110001B ;白底蓝字
color ends
 
stack segment
  dw 0,0,0,0,0,0,0,0
stack ends
 
codesg segment
start:
    mov ax,stack
    mov ss,ax
    mov sp,10H
    mov ax,color
    mov ds,ax
    mov bx,2
    
    mov cx,3
colorpush:
      mov al,0
      mov ah,[bx]
      push ax
      sub bx,1
      loop colorpush
    
    ;计算第一个输出位置
    mov bx,1824
    mov ax,0B800H
    mov ds,ax
    mov ax,datasg
    mov es,ax
    
      
    mov cx,3
    outputloop:
      mov si,0
      mov di,cx   
      pop dx;取得输出颜色     
      mov cx,16       
      outputline:;向输出位置输出数据        
        mov dl,es:[si]
        mov [bx],dx;字符+属性                       
        ;计算下一个输出位置
        inc si
        add bx,2
        loop outputline
      mov cx,di
      add bx,128
      loop outputloop
    mov ax,4c00H
    int 21H
codesg ends
 
end start

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值