实验 5

Posted cymwn-com

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了实验 5相关的知识,希望对你有一定的参考价值。

南京信息工程大学实验报告

实验名称 实验 5 编写、调试具有多个段的程序   实验日期  11.26  得分

学院 计软院

专业 计算机科学与技术

年级 2017级

班次 5班

姓名 陈奕明

学号 20171308194


一、实验目的
1. 理解和掌握将数据、代码、栈放入不同段的程序的编写和调试 2. 理解具有多个段的汇编源程序对应的目标程序执行时,内存分配方式


二、实验准备
1. 结合第6章教材和课件,复习第6章内容 2. 复习第3章「栈」的知识


三、实验内容
教材133实验 5 ps: 1. 实验5相关提示见本文档最后一部分「附:实验5提示&说明」 2. 为提高实验效率,我已将实验 5 的程序框架准备好,可以从课程公邮→文件中心→ 实验文件夹,下载实验5程序框架。


四、实验结论
实验(1):

i.程序返回前,data段中的数据应为原有数据保持不变,即0123h,0456h,0789h,0abch,0defh,0fedh,0cbah,0987h

ii.程序返回前,cs=076c、ss=076b、ds=076a

iii.设程序加载后,code段的段地址为X,则data段的段地址为x-20h,stack段的段地址为x-10h

 

 

实验(2):

 

i.程序返回前,data段中的数据应为原有数据保持不变,即0123h,0456h

 

ii.程序返回前,cs=076c、ss=076b、ds=076a

 

iii.设程序加载后,code段的段地址为X,则data段的段地址为x-20h,stack段的段地址为x-10h

iv.如果段中的数据占N个字节,则程序加载后,该段实际占有的空间为(n/16 + 1 )*16,即每个段中以16字节来对齐。

 

实验(3):

 i.程序返回前,data段中的数据应为原有数据保持不变,即0123h,0456h

 ii.程序返回前,cs=076A、ss=076E、ds=076D

 iii.设程序加载后,code段的段地址为X,则data段的段地址为x+20h,stack段的段地址为x+30h

 

问题(4):

经测试把第三个程序的“end start”改成“end”,经思考,结论如下:

1)"end start"的作用是指名程序的入口,“end”的功能是标志整个程序段的结束。

2)当各个程序中把“end start”改成“end”以后,程序即丧失程序入口语句

3)但是在2)的情况下第一个和第二个程序不能正常执行了,说明可能无法找到程序的入口,但是第三个程序却能正常执行,可见在这个程序中即使没有指明程

序的入口,它仍可从程序的入口开始执行程序,进行正确的操作。

4)只有程序三中的第一个机器码为代码,而前两个程序中的开始机器码都不是代码。

 结论如下:

1)在指明程序入口的情况,程序从程序入口开始执行

2)在没有指明程序入口的情况下,系统默认从程序的第一个机器码执行

 


实验任务(5),要求在博客中给出如下内容:

(1) 汇编程序源代码:

 

assume cs:code
a segment
  db 1,2,3,4,5,6,7,8
a ends

b segment
  db 1,2,3,4,5,6,7,8
b ends

c1 segment   
  db 8 dup(0)
c1 ends     
   
code segment
start:
       mov ax,a
       mov ds,ax
       mov bx,0
       mov ax,b
       mov es,ax
       
       mov cx,8
  s1: mov al,ds:[bx]
        add es:[bx],al
        inc bx
        loop s1
        
        mov cx,8
        mov bx,0
        mov ax,c1
        mov ds,ax
        
  s2: mov al,es:[bx]
       add ds:[bx],al
       inc bx
       loop s2
       
       mov ax,4c00h
       int 21h
       
       
code ends
end start

 

(2) 在debug中调试程序截图,截图中包括如下信息:

① 在实现数据相加前,逻辑段c的8个字节 ② 执行完实现加运算的代码后,逻辑段c的8个字节 (3) 根据①和②的调试,验证是否正确的实现数据相加。

技术分享图片

由截图得,相加成功。

实验任务(6), 要求在博客中给出如下内容:

(1) 汇编程序源代码

assume cs:code
a segment
  dw 1,2,3,4,5,6,7,8,9,0ah,0bh,0ch,0dh,0eh,0fh,0ffh
a ends

b segment
  dw 8 dup(0)
b ends

code segment
start: 
    mov ax,a
    mov ds,ax
    mov bx,0
    
    mov ax,b
    mov ss,ax
    mov sp,10h
    
    mov cx,8
    s:push [bx]
    add bx,2
    loop s

    mov ax,4c00h
    int 21h
    
code ends
end start

(2) 在debug中调试程序截图,截图中包括如下信息: ① 在push操作执行前,查看逻辑段b的8个字单元信息截图 ② 执行 push操作,然后再次查看逻辑段b的8个子单元信息截图

技术分享图片

(3) 根据①和②的调试,验证是否正确的实现数据相加。

根据实验截图,实验成功,前8个字型数据已经逆序存储到b中。

 

五、总结与体会
 本次实验中,重点我明白了X86cpu的段的概念:

x86的一个段的大小是16个字节,也就是说所有的段开始的位置必须是16的整数倍,因此一个段分配的时候大小是16的整数倍,

那么1-16个字节,段需要16字节17-32个字节需要32个字节一次类推,N个字节就需要(N/16+1)*16。

并且对loop循环指令以及多个程序段的源码执行文件和预分配空间命令有了进一步的了解。













以上是关于实验 5的主要内容,如果未能解决你的问题,请参考以下文章

[NTUSTISC pwn LAB 7]Return to libc实验(puts泄露libc中gadget片段定位)

VSCode自定义代码片段5——HTML元素结构

VSCode自定义代码片段5——HTML元素结构

VSCode自定义代码片段5——HTML元素结构

使用 React 实验性中继片段:缺少属性 '"$fragmentRefs"'

[NTUSTISC pwn LAB 5]rop入门实验