实验三 转移指令跳转原理及其简单应用编程
一、实验目的
- 理解和掌握转移指令的跳转原理
- 掌握使用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 ,分析正确。
![]()
-
- 根据call指令的跳转原理,先从理论上分析,程序执行到退出(line31)之前,寄存器(ax) = ? 寄存器(bx) = ? 寄存器(cx) = ?
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压入栈中,再转移。










浙公网安备 33010602011771号