实验三 转移指令跳转原理及其简单应用编程
四、实验结论
1. 实验任务1
此部分书写内容:
给出程序task1.asm源码,及,运行截图
task1.asm源码:
运行截图:
回答问题①
① line27, 汇编指令 loop s1 跳转时,是根据位移量跳转的。通过debug反汇编,查看其机
器码,分析其跳转的位移量是多少?(位移量数值以十进制数值回答)从CPU的角度,说明
是如何计算得到跳转后标号s1其后指令的偏移地址的。
debug反汇编:
line27的机器码: E2F2
跳转的位移量: -14 (0Dh - 1Bh = 13 - 27 = -14)
1.执行机器码 E2F2后,CS:IP 指向标号s1处的指令
2.CPU读取标号s1处的指令进入指令缓冲器
3.(IP) = (IP) + 标号s1处指令的长度,得到s1其后的指令的偏移地址
回答问题②
② line44,汇编指令 loop s2 跳转时,是根据位移量跳转的。通过debug反汇编,查看其机
器码,分析其跳转的位移量是多少?(位移量数值以十进制数值回答)从CPU的角度,说明
是如何计算得到跳转后标号s2其后指令的偏移地址的。
debug反汇编:
line44机器码:E2F0
跳转的位移量: -16 (29h - 39h = -10h )
1.执行机器码 E2F0后,CS:IP 指向标号s2处的指令
2.CPU读取标号s2处的指令进入指令缓冲器
3.(IP) = (IP) + 标号s2处指令的长度,得到s2其后的指令的偏移地址
问题③
③ 附上上述分析时,在debug中进行调试观察的反汇编截图
第①题的调试截图:
第②题调试截图:
2. 实验任务2
此部分书写内容:
给出程序task2.asm源码
① 根据call指令的跳转原理,先从理论上分析,程序执行到退出(line31)之前,寄存器(ax) =
? 寄存器(bx) = ? 寄存器(cx) = ?
(ax) = offset s1
(bx) = offset s2
(cx) = cs
② 对源程序进行汇编、链接,得到可执行程序task2.exe。使用debug调试,观察、验证调试
结果与理论分析结果是否一致。
调试结果与理论分析结果一致。
3. 实验任务3
此部分书写内容:
给出程序源码task3.asm
1 data segment 2 x db 99, 72, 85, 63, 89, 97, 55 3 len equ $- x 4 data ends 5 6 code segment 7 start: 8 mov ax,data 9 mov ds,ax 10 11 mov di,0 ;指向第一个数据 12 mov cx,7 13 14 s: mov ah,0 ;将高位置0 15 mov al,[di] 16 mov bl,10 ;除数10(十进制) 17 18 call printNumber 19 call printSpace 20 inc di 21 22 loop s 23 24 mov ah,4ch 25 int 21h 26 27 printNumber: 28 div bl 29 mov bx,ax 30 31 mov ah,2 32 33 or bl,00110000b ;bl 商 34 mov dl,bl 35 int 21h 36 37 or bh,00110000b ;bh 余数 38 mov dl,bh 39 int 21h 40 ret 41 42 printSpace: 43 mov ah,2 44 mov dl,' ' 45 int 21h 46 ret 47 48 49 code ends 50 end start
运行测试截图
4. 实验任务4
此部分书写内容:
给出程序源码task4.asm
1 assume ds:data, cs:code 2 data segment 3 x db 'try' 4 len equ $ - x 5 data ends 6 7 code segment 8 start: 9 mov ax,data 10 mov ds,ax 11 12 mov si,0 ;指向数据 13 mov di,0 ;屏幕第一行 14 mov cx,len 15 16 s: mov bl,[si] ;低位存放数据 17 mov bh,02 ;黑底绿字 18 call printStr 19 inc si 20 loop s 21 22 mov si,0 23 mov di,0F00h ;屏幕最后一行 24 mov cx,len 25 26 s1: mov bl,[si] 27 mov bh,04 ;黑底红字 28 call printStr 29 inc si 30 loop s1 31 32 mov ah,4ch 33 int 21h 34 35 36 printStr: 37 mov ax,0b800h 38 mov es,ax 39 40 mov es:[di],bx 41 add di,2 42 ret 43 44 code ends 45 end start
运行测试截图
5. 实验任务5
此部分书写内容:
给出程序源码task5.asm
1 assume ds:data, cs:code 2 data segment 3 stu_no db '201983290103' 4 len = $ - stu_no 5 data ends 6 7 code segment 8 start: 9 mov ax,data 10 mov ds,ax 11 12 mov ax,0b800h 13 mov es,ax ;设置显示缓冲区 14 mov di,0 ;指向data数据 15 mov cx,2000 ;80×25 屏幕中所有字符 16 mov si,0 ;遍历整个屏幕 17 18 mov bh,00010111b ;设置蓝底白字 19 mov bl,0 ;清除bl中杂乱信息 20 s: call print 21 loop s 22 23 mov cx,80 24 mov si,0f00h ;指向最后一行第一个字符 25 mov bl,'-' ;设置最后一行全为'-' 26 s1: call print 27 loop s1 28 29 mov cx,len 30 mov si,0f44h 31 32 s2: mov bl,[di] 33 call print 34 inc di 35 loop s2 36 mov ah,4ch 37 int 21h 38 print: 39 mov es:[si],bx 40 add si,2 41 ret 42 43 44 code ends 45 end start
运行测试截图