实验3 转移指令跳转原理及其简单应用编程
一、实验结论
1、实验任务1
- 给出程序task1.asm源码,及运行截图
1 assume cs:code, ds:data 2 data segment 3 x db 1, 9, 3 4 len1 equ $ - x ; 符号常量, $指下一个数据项的偏移地址,这个示例中,是3 5 y dw 1, 9, 3 6 len2 equ $ - y ; 符号常量, $指下一个数据项的偏移地址,这个示例中,是9 7 data ends 8 code segment 9 start: 10 mov ax, data 11 mov ds, ax 12 mov si, offset x ; 取符号x对应的偏移地址0 -> si 13 mov cx, len1 ; 从符号x开始的连续字节数据项个数 -> cx 14 mov ah, 2 15 s1:mov dl, [si] 16 or dl, 30h 17 int 21h 18 mov dl, ' ' 19 int 21h ; 输出空格 20 inc si 21 loop s1 22 mov ah, 2 23 mov dl, 0ah 24 int 21h ; 换行 25 mov si, offset y ; 取符号y对应的偏移地址3 -> si 26 mov cx, len2/2 ; 从符号y开始的连续字数据项个数 -> cx 27 mov ah, 2 28 s2:mov dx, [si] 29 or dl, 30h 30 int 21h 31 mov dl, ' ' 32 int 21h ; 输出空格 33 add si, 2 34 loop s2 35 mov ah, 4ch 36 int 21h 37 code ends 38 end start
- 回答问题①line27, 汇编指令 loop s1 跳转时,是根据位移量跳转的。通过debug反汇编,查看其机器码,分析其跳转的位移量是多少?(位移量数值以十进制数值回答)从CPU的角度,说明是如何计算得到跳转后标号s1其后指令的偏移地址的。

答:通过反汇编可查看指令loop s1的机器码为E2F2,其中F2是以补码形式表示的位移量,F2H=[11110010]补=[10001110]原=-14,因此其位移量为-14。在执行指令loop s1时的IP为0019,IP+2即为001B,在此基础上加上位移量-14后的IP为000D,从而实现跳转。
- 回答问题②line44,汇编指令 loop s2 跳转时,是根据位移量跳转的。通过debug反汇编,查看其机器码,分析其跳转的位移量是多少?(位移量数值以十进制数值回答)从CPU的角度,说明是如何计算得到跳转后标号s2其后指令的偏移地址的。

答:通过反汇编可查看指令loop s2的机器码为E2F0,其中是F0以补码形式表示的位移量,F0H=[11110000]补=[10010000]原=-16,因此其位移量为-16。在执行指令loop s2时的IP为0037,IP+2即为0039,在此基础上加上位移量-16后的IP为0029,从而实现跳转。
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)=s1代码段的起始地址,寄存器(bx)=S2代码段的起始地址,寄存器(cx)=cs中存的地址。 执行call word ptr ds:[0]时,IP为下一条指令的起始地址,即IP为s1代码段的起始地址。此时,将IP=0021压入栈中。随后指令跳转到ds:[0]存放的地址,即s1代码段,此时执行出栈操作,将栈中的0021赋值给ax。所以ax的值就是s1的起始地址。 执行call dword ptr ds:[2]类似,但是压入栈中的变为CS和IP,出栈时,先出栈IP,再出栈CS,因此将IP的值赋给bx,将cs的值赋给cx。所以,bx的值是s2代码起始地址的IP值,cx的值是s2代码段的cs值。
-
- ② 对源程序进行汇编、链接,得到可执行程序task2.exe。使用debug调试,观察、验证调试结果与理论分析结果是否一致。




答:调试结果与理论分析一致。
3、实验任务3
- 给出程序源码task3.asm
1 assume cs:code, ds:data 2 data segment 3 x db 99, 72, 85, 63, 89, 97, 55 4 len equ $ - x 5 data ends 6 code segment 7 start: 8 mov ax,data 9 mov ds,ax 10 mov byte ptr ds:[len],10 11 mov cx,7 12 mov bx,0 13 s: mov al,ds:[bx] 14 mov ah,0 15 inc bx 16 call printNumber 17 call printSpace 18 loop s 19 mov ah,4ch 20 int 21h 21 printNumber: 22 div byte ptr ds:[len] 23 mov dx,ax 24 mov ah,2 25 or dl,30h 26 int 21h 27 mov ah,2 28 mov dl,dh 29 or dl,30h 30 int 21h 31 ret 32 printSpace: 33 mov dl,' ' 34 mov ah,2 35 int 21h 36 ret 37 code ends 38 end start
- 运行测试截图


4、实验任务4
- 给出程序源码task4.asm
1 assume ds:data, cs:code 2 3 data segment 4 str db 'try' 5 len equ $ - str 6 data ends 7 8 code segment 9 start: 10 mov ax,data 11 mov ds,ax 12 13 mov si,0 14 mov cx,len 15 mov bh,0 16 mov bl,00000010B 17 call printStr 18 19 mov si,0 20 mov cx,len 21 mov bh,24 22 mov bl,00000100B 23 call printStr 24 25 mov ax,4c00h 26 int 21h 27 28 29 printStr: 30 mov ax,0b800h 31 mov es,ax 32 33 mov al,bh 34 mov bh,0a0h 35 mul bh 36 mov bp,ax 37 s: 38 mov ah,ds:[si] 39 mov es:[bp],ah 40 inc bp 41 mov es:[bp],bl 42 inc bp 43 inc si 44 loop s 45 ret 46 47 code ends 48 end start
- 运行测试截图

5、实验任务5
- 给出程序源码task5.asm
1 assume ds:data, cs:code 2 3 data segment 4 stu_no db '201983290054' 5 len = $ - stu_no 6 data ends 7 8 code segment 9 start: 10 mov ax,0b800h 11 mov es,ax 12 mov bp,1 13 mov cx,8000h 14 15 first: 16 mov byte ptr es:[bp],00011111B 17 add bp,2 18 loop first 19 20 mov ax,data 21 mov ds,ax 22 mov ax,0050h 23 sub ax,len 24 mov bh,02h 25 div bh 26 mov bl,al 27 mov bh,0 28 29 mov ax,0b800h 30 mov es,ax 31 mov bp,0F00h 32 mov cx,bx 33 34 s: 35 mov byte ptr es:[bp],'-' 36 inc bp 37 inc bp 38 loop s 39 40 mov cx,len 41 mov di,0 42 43 s1: 44 mov al,ds:[di] 45 mov es:[bp],al 46 inc bp 47 inc bp 48 inc di 49 loop s1 50 51 mov cx,bx 52 53 s2: 54 mov byte ptr es:[bp],'-' 55 inc bp 56 inc bp 57 loop s2 58 59 mov ax,4c00h 60 int 21h 61 62 code ends 63 end start
- 运行测试截图



浙公网安备 33010602011771号