• 实验五


    (1)

    1,CPU执行程序,程序返回前,data段的数据为

    23  01 56  04 89  07 BC  0A EF  0D ED  0F BA  0C 87 09

    0123h 0456h 0789h 0ABCh 0DEFh 0FEDh 0CBAh 0987h

    2,CPU,cs=0772h, ss=0771h,ds=0770h

    3 设程序加载后,code段地址为x, 则data段地址为x-2h,stack段地址为x-1h

    (2)

    1,CPU执行程序,程序返回前,data段的数据为

    23  01 56  04

    0123h 0456h

    2,CPU执行程序,程序返回前,cs=0772h, ss=0771h,ds=0770h

    3 设程序加载后,code段地址为x, 则data段地址为x-2h,stack段地址为x-1h

    4,如果段中数据占N个字节,该段实际占有的空间为[(N+15)/16].

    ([x]是高斯(取整)函数)

    (3)

    1,CPU执行程序,程序返回前,data段的数据为

    23  01 56  04

    0123h 0456h

    2,CPU执行程序,程序返回前,cs=0770h, ss=0774h,ds=0773h

    3 设程序加载后,code段地址为x, 则data段地址为x+3h,stack段地址为x+4h

    (4)

    第三个仍然可以执行。因为把end start 改为end后,程序就不会从start开始执行了,所以IP的初值为0,所以会从第一个段开始执行。

    而只有第三个程序的机器码在前面,所以仅第三个仍然可以执行。

    (5)

    源代码:

     1 assume cs:code
     2 a1 segment
     3   db 1,2,3,4,5,6,7,8
     4 a1 ends
     5 
     6 b1 segment
     7   db 1,2,3,4,5,6,7,8
     8 b1 ends
     9 
    10 c1 segment   ; 在集成软件环境中,请将此处的段名称由c→改为c1或其它名称
    11   db 8 dup(0)
    12 c1 ends        ; 改的时候要成对一起修改
    13 code segment
    14 start:
    15     mov ax,a1
    16     mov ds,ax
    17     mov cx,8
    18     mov bx,0
    19     
    20 s:  mov ax,[bx]
    21     add ax,[bx+10h]
    22     mov [bx+20h],ax
    23     add bx,2
    24     loop s
    25     
    26     mov ax,4c00h
    27     int 21h
    28 code ends
    29 end start

     ①在实现数据相加前,逻辑段c的8个字节

    ②执行完实现加运算的代码后,逻辑段c的8个字节

    根据①和②的调试,数据相加正确。(此处用的是字型数据的加法,而不是字节的加法,而且是重复了8次,(后面的00+00看不出来所以就没有用黄色笔标注,不是只有前面加了,后面也相加了!!!)但是毕竟没有进位,所以看不出来区别,而题目中也没有说明,a,b段中的数据如何相加,此处不影响结果。

    (6)

     1 assume cs:code
     2 a1 segment
     3   dw 1,2,3,4,5,6,7,8,9,0ah,0bh,0ch,0dh,0eh,0fh,0ffh
     4 a1 ends
     5 
     6 b1 segment
     7   dw 8 dup(0)
     8 b1 ends
     9 
    10 code segment
    11 start: 
    12     mov ax,a1
    13     mov ds,ax
    14     mov cx,8
    15     mov bx,0
    16     mov ax,b1
    17     mov ss,ax
    18     mov sp,10h
    19 s:  push [bx]
    20     add bx,2
    21     loop s
    22     
    23     mov ax,4c00h
    24     int 21h
    25 code ends
    26 end start

    6.(2)

     

     ① 在push操作执行前,查看逻辑段b的8个字单元信息截图

     

     ② 执行 push操作,然后再次查看逻辑段b的8个子单元信息截图

     

    根据①和②的调试,数据相加正确。

    总结与体会

     在程序二(4)的填空蒙了一下,具体过程可参见(老师上课有提示,不过鄙人愚钝,只能查资料了。。。)

    编译器实际的处理方式是将段中的所有内容放在一个段的起始地址处,下一个段里的所有内容放在后续一个段的起始地址处(这也是汇编指令segment的本义:将不同数据分段)。这样,即使段中只包含一个字节,也要占一个段(16个字节),所以,一个段实际占用的空间=(段中字节数+15)/16。

    https://wenku.baidu.com/view/ca6ae5b30342a8956bec0975f46527d3240ca6c3.html

    完成第六个实验的时候,犯了一点低级错误,记反了字节型数据和字型数据,

    现纠正如下:字节型数据只占一个字节;字型数据占连续两个字节,低字节在前,高字节在后。

    然后重新看了一下第五个实验的内容。

    发现那个加法后面的00也是参加运算的,也就是说,在第五个实验中,cx的值从4到8都可以,都不会影响实验结果。

    (我开始没有思考,直接写的cx=8 ,add bx,2。现在理解清楚了:如果这题有9个字节型数据,也是应该写cx=8,而不是cx=9)

  • 相关阅读:
    bzoj 3594: [Scoi2014]方伯伯的玉米田
    普通平衡树(指针splay)
    codeforces 475D. CGCDSSQ
    php 购物车功能
    PHP现阶段发现的不足点
    php 多维数据根据某个或多个字段排序
    redis可视化辅助工具
    Redis在window下安装以及配置
    hive数据操作
    hive 表分区操作
  • 原文地址:https://www.cnblogs.com/asm085/p/9983214.html
Copyright © 2020-2023  润新知