实验3 转移指令跳转原理及其简单应用编程
2021/11/28 14:12:00
本文主要是介绍实验3 转移指令跳转原理及其简单应用编程,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
实验任务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回答问题① ① line27, 汇编指令 loop s1 跳转时,是根据位移量跳转的。通过debug反汇编,查看其机 器码,分析其跳转的位移量是多少?(位移量数值以十进制数值回答)从CPU的角度,说明 是如何计算得到跳转后标号s1其后指令的偏移地址的。
机器码为E2F2,F2的八位二进制形式为11110010,其补码为10001110,十进制形式为-14,即位移量为14
CPU:首先通过读取指令的长度修改ip的值,ip=ip+指令长度,然后执行loop s1,跳转到s1处,位移量等于s1处的偏移地址减去当前ip指向地址的偏移地址
回答问题② ② line44,汇编指令 loop s2 跳转时,是根据位移量跳转的。通过debug反汇编,查看其机 器码,分析其跳转的位移量是多少?(位移量数值以十进制数值回答)从CPU的角度,说明 是如何计算得到跳转后标号s2其后指令的偏移地址的。 line44 loop命令的机器码为E2F0,F0的八位二进制形式为11110000,补码为10010000,十进制形式为-16,即位移量为16 CPU:首先通过读取指令的长度修改ip的值,ip=ip+指令长度,然后执行loop s2,跳转到s2处,位移量等于s2处的偏移地址减去当前ip指向地址的偏移地址 问题③ ③ 附上上述分析时,在debug中进行调试观察的反汇编截图实验任务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) = ? call word ptr ds:[0] 短转移, 将下一条指令偏移地址(ip)压入栈, 并转移至 ds:[0]地址即 s1 处, 此后的 pop ax 将该内容出栈给ax;
call dword ptr ds:[2]为段间转移, 将下一条指令基址和偏移地址(cs 和 ip)压入栈, 并转移至 ds:[2] 地址即 s2 处, 此后的 pop bx 将ip出栈给bx, pop cx 将 cs 出栈给 cx. AX=0021 BX=0026 CX=076C ② 对源程序进行汇编、链接,得到可执行程序task2.exe。使用debug调试,观察、验证调试 结果与理论分析结果是否一致。
实验任务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 13 mov cx, len 14 mov si, 0 15 print: 16 mov al, [si] 17 mov ah, 0 18 call printNumber 19 call printSpace 20 inc si 21 loop print 22 23 mov ah, 4ch 24 int 21h 25 26 printNumber: 27 mov bl, 10 28 div bl 29 mov bx, ax 30 31 mov ah, 2 32 33 mov dl, bl ; 打印商 34 or dl, 30h 35 int 21h 36 37 mov dl, bh ; 打印余数 38 or dl, 30h 39 int 21h 40 ret 41 42 printSpace: 43 mov ah, 2 44 mov dl, ' ' 45 int 21h 46 ret 47 48 code ends 49 end start运行测试截图
实验任务4 此部分书写内容: 给出程序源码task4.asm
1 assume cs:code, ds:data 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 bh, 0 ;指定第一行 14 mov bl, 2 ;黑底绿字 15 call printStr 16 17 mov bh, 24 ;指定最后1行 18 mov bl, 4 ;黑底红字 19 call printStr 20 21 mov ah, 4ch 22 int 21h 23 24 printStr: 25 mov al,0ah ;每行160字节 26 mul bh ;与行号相乘获得行起始地址 27 add ax, 0b800h 28 mov es,ax 29 30 mov cx, len ;字符串长度 31 mov si, offset str 32 mov di, si 33 s: 34 mov al, [si] 35 mov ah, bl ;把颜色属性传入 36 mov es:[di], ax ;把要显示的字符送入显存 37 inc si 38 add di, 2 39 loop s 40 ret 41 code ends 42 end start
运行测试截图
实验任务5 此部分书写内容: 给出程序源码task5.asm
1 assume cs:code, ds:data 2 3 data segment 4 stu_no db '201983290032' 5 len = $ - stu_no 6 data ends 7 8 code segment 9 start: 10 mov ax, data 11 mov ds, ax 12 mov di, 0 13 14 call printStuNum 15 16 mov ah, 4ch 17 int 21h 18 19 printStuNum: 20 mov ax, 0b800h 21 mov es, ax 22 mov si, 1 23 24 mov al, 24 25 mov dl, 80 26 mul dl 27 28 mov cx, ax 29 printBlue: 30 mov al, 17h ;00010111 31 mov es:[si], al ;填充颜色 32 add si, 2 33 loop printBlue 34 35 sub si, 1 36 mov ax, 80 37 sub ax, len 38 mov dl, 2 39 div dl 40 mov dx, ax ;保存-的长度 41 42 mov cx, dx 43 call printheng 44 45 mov cx, len 46 printStu: ;输出学号 47 mov al, ds:[di] 48 mov ah, 17h 49 mov word ptr es:[si], ax 50 inc di 51 add si, 2 52 loop printStu 53 54 mov cx, dx 55 call printheng 56 57 ret 58 59 printheng: 60 mov al, '-' 61 mov ah, 17h 62 mov word ptr es:[si], ax 63 add si, 2 64 loop printheng 65 ret 66 67 code ends 68 end start
运行测试截图
这篇关于实验3 转移指令跳转原理及其简单应用编程的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-23Springboot应用的多环境打包入门
- 2024-11-23Springboot应用的生产发布入门教程
- 2024-11-23Python编程入门指南
- 2024-11-23Java创业入门:从零开始的编程之旅
- 2024-11-23Java创业入门:新手必读的Java编程与创业指南
- 2024-11-23Java对接阿里云智能语音服务入门详解
- 2024-11-23Java对接阿里云智能语音服务入门教程
- 2024-11-23JAVA对接阿里云智能语音服务入门教程
- 2024-11-23Java副业入门:初学者的简单教程
- 2024-11-23JAVA副业入门:初学者的实战指南