实验三 转移指令跳转原理及其简单应用编程

 

一、实验目的

  • 理解和掌握转移指令的跳转原理 
  • 掌握使用call和ret指令实现子程序的方法,理解和掌握其参数传递方式
  • 理解和掌握80×25彩色字符模式显示原理
  • 综合应用寻址方式和汇编指令完成简单应用编程

二、实验结论

1.实验任务1

  • 程序task1.asm源码
 1 assume cs:code, ds:data
 2 
 3 data segment
 4     x db 1, 9, 3
 5     len1 equ $ - x
 6 
 7     y dw 1, 9, 3
 8     len2 equ $ - y
 9 data ends
10 
11 code segment
12 start:
13     mov ax, data
14     mov ds, ax
15 
16     mov si, offset x
17     mov cx, len1
18     mov ah, 2
19  s1:mov dl, [si]
20     or dl, 30h
21     int 21h
22 
23     mov dl, ' '
24     int 21h
25 
26     inc si
27     loop s1
28 
29     mov ah, 2
30     mov dl, 0ah
31     int 21h
32 
33     mov si, offset y
34     mov cx, len2/2
35     mov ah, 2
36  s2:mov dx, [si]
37     or dl, 30h
38     int 21h
39 
40     mov dl, ' '
41     int 21h
42 
43     add si, 2
44     loop s2
45 
46     mov ah, 4ch
47     int 21h
48 code ends
49 end start
  • 程序task1.asm运行截图

 

  • 问题1:line27,汇编指令loop s1 跳转时,是根据位移量跳转的。通过debug反汇编,查看其机器码,分析其跳转的位移量是多少?(位移量数值以十进制数值回答)从CPU的角度,说明是如何计算得到跳转后标号s1其后指令的偏移地址的。
    • 答:

      Loop s1的机器码为E2F2, F2是-14的补码,且loop指令为循环指令是短转移指令,所以位移量为 -14。

      CPU读取指令loop s1,CS:IP指向下一条指令MOV AH,02,此时IP=001Bh;CPU执行指令Loop s1后CS:IP指向指令 MOV DL, [SI],此时IP=000D,所以位移量为-14.

 

  • 问题2:line44,汇编指令loop s2跳转时,是根据位移量跳转的。通过debug反汇编,查看其机器码,分析其跳转的位移量是多少?(位移量数值以十进制数值回答)从CPU的角度,说明是如何计算得到跳转后标号s2其后指令的偏移地址的。
    • 答:

      Loop s2的机器码为E2F0, F0是-16的补码,且loop指令为循环指令是短转移指令,所以位移量为 -16。

      CPU读取指令loop s2,CS:IP指向下一条指令MOV AH,4C,此时IP=0039h;CPU执行指令Loop s1后CS:IP指向指令 MOV DL, [SI],此时IP=0029h,所以位移量为-16.

2.实验任务2

  • 给出程序task2.asm源码
    •  1 assume cs:code, ds:data
       2 
       3 data segment
       4     dw 200h, 0h, 230h, 0h
       5 data ends
       6 
       7 stack segment
       8     db 16 dup(0)
       9 stack ends
      10 
      11 code segment
      12 start:  
      13     mov ax, data
      14     mov ds, ax
      15 
      16     mov word ptr ds:[0], offset s1
      17     mov word ptr ds:[2], offset s2
      18     mov ds:[4], cs
      19 
      20     mov ax, stack
      21     mov ss, ax
      22     mov sp, 16
      23 
      24     call word ptr ds:[0]
      25 s1: pop ax
      26 
      27     call dword ptr ds:[2]
      28 s2: pop bx
      29     pop cx
      30 
      31     mov ah, 4ch
      32     int 21h
      33 code ends
      34 end start

       

  • 给出分析、调试、验证后,寄存器(ax) = ? (bx) = ? (cx) = ? 附上调试结果界面截图。
    • 根据call指令的跳转原理,先从理论上分析,程序执行到退出(line31)之前,寄存器(ax) = ? 寄存器(bx) = ? 寄存器(cx) = ?
      • 理论分析:
      • Ax的值为读取call word ptr ds:[0] 指令后,下一条指令的IP值。

        Bx的值为读取call dword ptr ds:[2] 指令后,下一条指令的IP值。

        Cx 的值为读取call dword ptr ds:[2] 指令后,下一条指令的段地址CS值。

        原因:CPU执行call指令时,进行两步操作:将当前的IP或CS和IP压入栈,然后再进行转移。

    • 对源程序进行汇编、链接,得到可执行程序task2.exe。使用debug调试,观察、验证调试 结果与理论分析结果是否一致。
      • 通过debug反汇编和第一小题的理论分析可得,Ax=0021h ,Bx=0026h,Cx=076Ch。

      • 验证得到:Ax=0021h,Bx=0026h,Cx=076Ch ,分析正确。

3.实验任务3

  • 给出程序源码task3.asm

    •  1 assume cs:code, ds:data
       2 
       3 data segment
       4     x db 99, 72, 85, 63, 89, 97, 55
       5     len equ $ - x
       6 data ends
       7 
       8 code segment
       9 start:
      10     mov ax, data
      11     mov ds, ax
      12     mov si, offset x
      13     mov cx, len
      14  s1:
      15     mov al, [si]
      16     mov ah, 0
      17     call printNumber ;调用输出一个两位数 
      18     call printSpace ;输出一个空格
      19     inc si
      20     loop s1
      21 
      22     mov ah, 4ch
      23     int 21h
      24 printNumber: 
      25     mov byte ptr ds:[7],0ah ; 存放除数10
      26     div byte ptr ds:[7]
      27     mov bx,ax  ; 将商和余数 赋值给 bx
      28     mov ah,2
      29     mov dl,bl   ; 商
      30     or dl,30h  ;转化为字符
      31     int 21h
      32     mov dl,bh  ; 余数
      33     or dl,30h  ;转化为字符
      34     int 21h
      35     ret
      36 
      37 printSpace:
      38     mov ah,2
      39     mov dl, ' '
      40     int 21h
      41     ret
      42 code ends
      43 end start
  • 运行测试截图

4.实验任务4 

  • 给出程序源码task4.as
    •  1 assume cs:code, ds:data
       2 
       3 data segment
       4     str db 'try'
       5     len equ $ - str
       6 data ends
       7 code segment
       8 start:
       9     mov ax, data
      10     mov ds, ax
      11     mov ax,0b800h 
      12     mov es,ax
      13 
      14     mov bh,0  ;指定0 行
      15     mov bl,2h ;黑底绿字
      16     mov cx,0   ;cx 清零用于存放 行开始位移
      17     call printStr ;调用第一次
      18 
      19     mov bh,24 ; 指定24 行
      20     mov bl,4h ;黑底红字
      21     call printStr ;调用第二次
      22 
      23     mov ah, 4ch
      24     int 21h
      25 
      26 printStr:
      27     mov si,offset str ;str=0
      28     mov cl,bh ;将cx寄存器用作存储计算数
      29     mov ax,cx 
      30     mov cx,160 ;每行有160个
      31     mul  cx
      32     mov bp,ax ; 结果在ax中
      33     mov cx,len ; 3个字符
      34 s: 
      35     mov al,ds:[si] ;低位为字符
      36     mov ah,bl ;高位为颜色
      37     mov es:[bp+si], ax
      38     inc si
      39     inc bp
      40     loop s
      41     ret
      42 code ends
      43 end start
  • 运行测试截图

5.实验任务5 

  • 给出程序源码task5.asm
    •  1 assume cs:code, ds:data
       2 
       3 data segment
       4     stu_no db '20192308064'
       5     len = $ - stu_no
       6 data ends
       7 
       8 code segment
       9 start:
      10     mov ax, data
      11     mov ds, ax
      12     mov ax,0b800h
      13     mov es,ax
      14     mov cx,2000 ;25*160/2
      15     mov si,1
      16 s:   
      17     mov byte ptr es:[si],23 ;蓝底白字
      18     inc si
      19     inc si
      20     loop s
      21     
      22     mov cx,80
      23     mov si,3840 ;24*160
      24 s1:
      25     mov byte ptr es:[si],'-'  ;输出-
      26     inc si
      27     inc si
      28     loop s1
      29 
      30     mov cx,len
      31     mov si,3910  ;24*160+70
      32     mov bx,0
      33 s2:
      34     mov al,ds:[bx]
      35     mov byte ptr es:[si],al ;输出学号
      36     inc si
      37     inc si
      38     inc bx
      39     loop s2
      40 
      41     mov ah, 4ch
      42     int 21h
      43 code ends
      44 end start
  • 运行测试截图

三、实验总结

  • 在80x25彩色字符模式下,显示器可以显示25行,每行80个字符,每个字符可以有256种属性。
  • 在80x25彩色字符模式的一行中,一个字符占两个字节的存储空间,低位字节存储字符的ASCII码,高位字节存放字符的属性。一行有80个字符,占160个字节。
  • 属性字节格式 BL (RGB) I (RGB) ,BL控制闪烁,第一个RGB控制背景颜色,L控制高亮,第二个RGB控制前景颜色。
  • CPU执行call命令时,进行两步操作。将当前的IP或CS和IP压入栈中,再转移。

 

posted @ 2021-11-26 22:21  蓝桉66  阅读(229)  评论(2)    收藏  举报