码迷,mamicode.com
首页 > 其他好文 > 详细

实验五

时间:2018-12-01 15:34:15      阅读:230      评论:0      收藏:0      [点我收藏+]

标签:个数   min   利用   oop   end   查看   程序   机制   控制   

任务一:执行以下代码之后,得出结果。

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
        mov ds, ax
        
        push ds:[0]
        push ds:[2]
        pop ds:[2]
        pop ds:[0]
        
        mov ax,4c00h
        int 21h

code ends
end start

 

数据段中的数据:较之前并未改变

技术分享图片

第一次找到的数据:原因是076C:0041 不是结束地址

技术分享图片

第二次:cs:001d是汇编之后的代码结束地址(cx代表所有指令所占字长?)

技术分享图片

 

 程序加载后,code段地址为X,data段地址为X-2,stack段地址为x-1;

任务二:

assume cs:code, ds:data, ss:stack
data segment
  dw 0123h, 0456h
data ends

stack segment
  dw 0, 0
stack ends

code segment
start:  mov ax,stack
        mov ss, ax
        mov sp,16
        
        mov ax, data
        mov ds, ax
        
        push ds:[0]
        push ds:[2]
        pop ds:[2]
        pop ds:[0]
        
        mov ax,4c00h
        int 21h

code ends
end start

  查看ds:正误对照如下

 技术分享图片

 结束地址仍然是001d,见上图。

 技术分享图片

 程序加载后,code段地址为X,data段地址为X-2,stack段地址为x-1;

如果段中数据占N个字节,则程序加载后,该段实际占有空间为: [(N+15)/16]*16。内存是以十六个字节为单位进行内存分配的。(来自http://www.cnblogs.com/gemini233/p/10003997.html )

 任务三:

注:需要-g之后用可以查看ds。否则:

技术分享图片

cs,ds,ss地址,ds内容分别如下。

技术分享图片

 程序加载后,code段地址为X,data段地址为X+3,stack段地址为x+4;

如果将(1)、(2)、(3)题中的“end srtart”改为“end” 不指明程序入口,程序执行情况会怎样?

第一次实验结果:和前一次并无二致---针对(3)

 技术分享图片

修改(1):

技术分享图片

上图是拓展名称导致的问题;

技术分享图片

与之前代码的明显区别。

修改(2):

 技术分享图片

也可见明显区别。

(1)和(2)会发生改变,取消 指明代码段开始位置,会从IP=0处开始执行,(1)和(2)对应的而是数据段。

(3)中IP=0处证号就是代码段开始的位置,因此去除“start”不会产生影响。(获得从博客:http://www.cnblogs.com/gemini233/p/10003997.html)

 

任务五:编写code段中代码,将a段和b段中的数据一次相加,将结果加入到c段。

根据定位的规律,以每16个字节为单位进行内存分配。

我使用的其他人的做法。

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

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

c1 segment   ; 在集成软件环境中,请将此处的段名称由c→改为c1或其它名称
  db 8 dup(0)
c1 ends	    ; 改的时候要成对一起修改
code segment
start:
      mov ax,a1;数据段a
      mov ds,ax
      
      mov bx,0
      mov cx,8
   s: mov ax,[bx];指定起始位置
     add ax,[bx+10h];段的之间相差整数个10h
     mov [bx+20h],ax
     add bx,2;每次增加两个字节
     loop s
     mov ax,4c00h
     int 21h
      code ends
end start

  原理:将[bx],以及[bx+10H]中的数据放在ax寄存器中,c1内存地址是[bx+20h]

技术分享图片

实际操作的时候,对内存单元进行add 还是 mov的指令不够明确。

先让一个数据段的内容放入ax寄存器中,利用指针偏移地址(类似数组)进行累加,最后送入c1段中。

任务六:编写code段用push 指令将a段中的前8个字型数据,逆序存储到b段中。

思想:栈顶指针随push 进行的元素增加而减小(往上移动),原本大的数字由于栈(由底向上存储的机制)而放在一开始。

我一开还想着要用pop 实在是没有必要,也反映出逻辑条理不够清晰就写代码。

技术分享图片

一开始没有做出来,发现是循环控制定位点 给错了。push的过程就是逆序的过程。

实验五

标签:个数   min   利用   oop   end   查看   程序   机制   控制   

原文地址:https://www.cnblogs.com/hongjie-di/p/10048969.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!