汇编语言实验五

  • 实验任务一

1.利用debug加载、跟踪程序

(1)先利用r命令来查看各个寄存器的值

(2)从cx中可知道程序的长度,用cx中的值减去20h(数据段和栈段已分配的空间)得到代码段的长度,用u命令精确反汇编

(3)先执行到000D之前,看看ds是否已成功指向数据段

(4)从上图可以看到ds已指向数据段,然后我们接着执行到程序返回前,即到001D之前,再查看一次数据段的内容

(5)从上图可以看到,数据段没有发生变化

2.书上的问题解答:

(1)程序返回前,data段中的数据为 23 01 56 04 89 07 BC 0A-EF 0D ED 0F BA 0C 87 09

(2)程序返回前,CS=076C,SS=076B,DS=076A

(3)设程序加载后,code段的段地址为X,则data段的段地址为X-2,stack段的段地址为X-1

  • 实验任务二

1.利用debug加载、跟踪程序

(1)先利用r命令查看各个寄存器的值

(2)从上图的cx我们可以看到,cx的值与任务一的一样。虽然任务二只定义了两个字数据的数据段和两个字型数据当栈空间,但实际上在内存分配上还是给它们16个字节的空间,于是我用u命令精确反汇编一下

(3)再用g命令执行到000D以前,看看ds是否指向数据段data

(4)从上图看出ds已指向数据段data,再执行到程序返回前,看看数据段data的变化

(5)从上图看出,数据段没有变化

2.书上问题的解答:

(1)程序返回前,data段中的数据为 23 01 56 04

(2)程序返回前,CS=076C,SS=076B,DS=076A

(3)设程序加载后,code段的段地址为X,则code段的段地址为X-2,stack段的段地址为X-1

(4)对于如下定义的段,若段中的数据占N个字节,则程序加载后,该段实际占有的空间为(N/16+1)*16(即数据的分配是以16个字节为单位的)

name segment
:
name ends
  • 实验任务三

1..利用debug加载、跟踪程序

(1)同样用r查看各个寄存器的值,并用u精确反汇编

(2)用g命令执行至000D之前,看看ds是否指向数据段data

(3)从上图可以看出,ds指向了数据段data,接着执行到程序返回前,再查看数据段data的值

(4)从上图可以看到,数据段中的值没有变化

2.书上问题的解答:

(1)程序返回前,data段中的数据为 23 01 56 04

(2)程序返回前,CS=076A,SS=076E,DS=076D

(3)设程序加载后,code段的段地址为X,则data段的段地址为X+3,stack段的段地址为X+4

  • 实验任务四

1.以实验任务三为例,删除end后面的start,执行看结果,步骤与上面一致

(通过上面的截图,我们可以发现与任务三中的结果完全一致,也就是说,除去了end后面的start,程序仍然能正确执行)

2.再以任务二为例,删去end后面的start,再执行查看结果,步骤与上面一致

(上图注意:此时精确反汇编的不同,变成以cs为段地址,以20h为偏移地址

(虽然执行的过程有所差异,但是执行后的结果是一致的,即去掉了end后面的start,也能正确执行)

3.书上问题解答:

(1)比较上面的过程与结果,我认为这三个程序去掉了end后面的start都能正确执行。唯一的不同点在于,虽然去掉了start,cs:ip的值会指向程序起始位置的段地址,但实际上随着程序的执行,最后总会将代码段执行完;而加上start之后,cs:ip的值一开始就直接指向了我们的代码段,更方便我们的操作。

  • 实验任务五

1.填写的程序代码如下:

start:   mov ax,a
         mov ss,ax ;利用段寄存器ss指向a段的起始位置

         mov ax,b
         mov es,ax ;利用段寄存器es指向b段的起始位置

         mov ax,c
         mov ds,ax ;利用段寄存器ds指向c段的起始位置

         mov bx,0
         mov cx,8
    s:   mov al,ss:[bx]
         mov [bx],al  ;将a段数据复制到c段中
         mov al,es:[bx]
         add [bx],al  ;将b段数据与c段的数据相加,结果保存在c段中
         inc bx       ;由于定义的是字节数据,所以只需要将bx加一
         loop s

         mov ax,4c00h
         int 21h

2.利用debug跟踪、执行

(1)先用r查看各个寄存器的值,再用u反汇编

(2)先执行到000A之前,可以查看a段和b段的数据,a段由ss段寄存器指向,b段由es段寄存器指向

(3)再执行到0022之前,看看c段中的结果

(4)从上图可以看到,实现了将a段和b段中数据的依次相加

3.补充:做完该实验才看到老师的tips,于是决定按照分段利用es的方法,再完成一次

(1)代码如下:

start: mov ax,c
         mov ds,ax ;利用段寄存器ds指向c段起始地址
         mov ax,a
         mov es,ax ;先利用段寄存器es指向a段起始地址

         mov bx,0
         mov cx,8
   s:   mov al,es:[bx]
         mov [bx],al     ;做一个将a段数据复制到c段中的循环
         inc bx
         loop s

         mov ax,b
         mov es,ax  ;再利用段寄存器es指向b段起始地址

         mov bx,0
         mov cx,8
   s0:  mov al,es:[bx]
         add [bx],al       ;再做一个将b段数据加到c段中的循环
         inc bx
         loop s0

         mov ax,4c00h
         int 21h

(2)利用debug跟踪、执行

(先执行到000A之前,看看a段的数据)

(再执行到0018之前,看看c段的数据)

(接着执行到001D之前,查看b段的数据)

(最后执行到程序返回前,看看c段中的结果)

(从上图可以看到,实现了a、b段数据的依次相加

  • 实验任务六

1.填写的代码如下:

start: mov ax,a
         mov ds,ax ;利用段寄存器ds指向a段

         mov ax,b
         mov ss,ax   ;利用段寄存器ss指向b段,让b段作为栈空间
         mov sp,16  ;初始化栈顶

         mov bx,0
         mov cx,8
     s:  push [bx]
         add bx,2
         loop s

         mov ax,4c00h
         int 21h

2.利用debug跟踪、执行

(1)用r查看各个寄存器的值,再用u反汇编

(2)先执行到0005,查看a段数据

(3)最后执行到程序返回前,看看b段中的数据

(从上图可以看到,实现了将a段中的前8个字型数据逆序存储到b段中

  • 总结与体会

1.通过本次实验熟悉并掌握了编写、调试具有多个段的程序,收获非常大

2.我上网搜索了一下关于实验任务二中提到的 “段中数据大小与实际占用空间” 这部分的内容:

3.关于实验任务一、二、三中都提到的,code段、data段、stack段的段地址的关系:

对于任务一和二,data段定义用了16个字节(0~f),stack段定义用了16个字节(10~2f),所以段地址会与代码段相差2和1;而在任务三中,代码段占了32个字节,所以后面定义的data的段地址和stack的段地址会与代码段相差3和4。

4.关于实验任务五,在我一开始写的代码中,除了ds和es之外,我还运用了ss段寄存器,这样就只需要执行一次循环,最后也同样达到了目的。因为我觉得当ss不用来定义栈空间时,它就只是一个普通的段寄存器,所以一样可以派上用场。

原文地址:https://www.cnblogs.com/kwcymino/p/10006595.html

时间: 2024-10-08 09:01:36

汇编语言实验五的相关文章

汇编语言 实验五

1.将下面的程序编译连接,用Debug加载.跟踪,然后回答问题. assume cs:code,ds:data,ss:stack data segment dw 0123h,0456h,0789h,0abch,0defh,0fedh,0cbah,0987h data ends stack segment dw 0,0,0,0,0,0,0,0 stack ends code segment start:  mov ax,stack mov ss,ax mov sp,16 mov ax,data m

MySQL数据库实验五:数据更新

实验五   数据更新 一.实验目的 掌握数据更新操作的用法. 二.实验环境 三.实验示例 1.?往基本表SC中插入元组. ①    INSERT INTO S(S#,SNAME,AGE,SEX) VALUES('S36','GU',20,'M'): ②   INSERT INTO SC(S#,C#) VALUES('S5','C8'): ③        INSERT INTO SC VALUES('S4','C4',85), ('S3','C6',90), ('S7','C2',70): ④

《信息安全系统设计基础》实验五

<信息安全系统设计基础>实验五 简单嵌入式WEB 服务器实验 班级:1452 姓名:20415208蔡野 20145235李涛 20145230熊佳伟 实验日期:2016.12.1 时间:10:10-12:30 实验序号:5 实验目的: 掌握在 ARM 开发板实现一个简单 WEB 服务器的过程 . 学习在 ARM 开发板上的 SOCKET 网络编程 . 学习 Linux 下的 signal()函数的使用 . 实验内容 阅读并理解源代码 进入/arm2410cl/exp/basic/07_htt

CCNP实验五:修改OSPF各类型路由的管理距离

一:基本配置 r1(config)#router ospf 1 r1(config-router)#net 1.1.0.0 0.0.255.255 area 1 r1(config-router)#net 12.1.1.1 0.0.0.0 area 0 r1(config-router)#redistribute connected subnets r2(config)#router ospf 1 r2(config-router)#net 12.1.1.2 0.0.0.0 area 0 r2(

20145331实验五 Java网络编程及安全

实验五 Java网络编程及安全 实验内容 1.掌握Socket程序的编写: 2.掌握密码技术的使用: 3.设计安全传输系统 4.结队伙伴:20145333赵嘉鑫 博客地址:http://home.cnblogs.com/u/5301z/ 5.分工:自己负责服务端,伙伴负责客户端 实验要求 1.基于Java Socket实现安全传输 2.基于TCP实现客户端和服务器,结对编程一人负责客户端,一人负责服务器 3.使用Git进行版本控制 4.选择对称算法进行数据加解密. 5.选择非对称算法对对称加密密

20145301实验五 Java网络编程及安全

北京电子科技学院(BESTI)实验报告 课程:Java程序设计 班级:1453 指导教师:娄嘉鹏 实验日期:2016.05.06 18:30-21:30 实验名称:实验五 Java网络编程 实验内容 1.用书上的TCP代码,实现服务器与客户端. 2.客户端与服务器连接 3.客户端中输入明文,利用DES算法加密,DES的秘钥用RSA公钥密码中服务器的公钥加密,计算明文的Hash函数值,一起传送给客户端 4.客户端用RSA公钥密码中服务器的私钥解密DES的,秘钥,用秘钥对密文进行解密,得出明文.计算

20145321 实验五实验报告

20145321 实验五实验报告 实验五 Java网络编程 1.客户端步骤: 建立网络连接 交换数据:加密使用AES或者DES/AES或者DES加密密钥key并发送 关闭网络连接 2.服务器端步骤: 监听端口 获得连接 交换数据:使用服务器的公钥加密/公钥算法使用RSA或DH/检验发送信息的完整性使用MD5或者SHA3 关闭连接 实验内容 使用Java语言进行网络编程,对明文进行加密 1.掌握Socket程序的编写: 2.掌握密码技术的使用: 3.掌握密码技术的使用: 实验步骤 查询IP地址:打

实验五Java网络编程及安全——20135337朱荟潼

实验五 Java网络编程及安全 结对伙伴:20135317韩玉琪(负责服务器方)http://www.cnblogs.com/hyq20135317/p/4567241.html 实验内容 1.掌握Socket程序的编写: 2.掌握密码技术的使用: 3.设计安全 实验步骤 1.信息安全传送: 发送方A——————>接收方B A加密时,用B的公钥 B解密时,用B的私钥 发送方A对信息(明文)采用DES密钥加密,使用RSA加密前面的DES密钥信息,最终将混合信息进行传递.同时用hash函数将明文进行

数据结构实验报告-实验五 查找

实验五   查找   l  实验目的 1. 查找的基本概念 掌握在数组上进行各种查找的方法和算法. 深刻理解各种方法的特点,并能灵活运用. 加深对查找的理解,逐步培养解决实际问题的能力. l  实验内容 1.查找的基本概念 (一)基础题 1.编写各种查找方法的基本操作函数: (1)search1(int *k,int n,int key)无序线性表的顺序查找: (2)search2(int *k,int n,int key)有序线性表的顺序查找: (3)bin_search(int *k,int