• 实验 5 编写、调试具有多个段的程序


    1.将下面的程序编译,连接,用debug加载、跟踪,然后回答问题。

    根据老师给出的代码,在电脑上自己实现一系列过程

     查看代码具体执行到哪个单元。

    42h包括了data与stack与输出部分三者所占据的代码字节数,减去即为需要实现的代码数

    由于对命令不能做到非常熟悉具体格式的地步,反复尝试了很多次。

    1.CPU执行程序,程序返回前,data中的数据为原始数据(入栈出栈的恢复)。

    2.CPU执行程序,程序返回前,cs=076CH,ss=076BH,ds=076AH.

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

    2.再次运用现成的程序段

     

     反汇编得到需要的字节数,查看寄存器的状态。

    1.CPU执行程序,程序返回前,data中的数据为16个字节空间,前两个字数据不变,其余为0。

    2.CPU执行程序,程序返回前,cs=076CH,ss=076BH,ds=076AH(与上题一致).

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

    4.对于如下定义的段:

    name segment

    ...

    name ends

    如果段中的数据占N个字节,则程序加载后,该段实际占有的空间为N除以16,取整数部分乘16,若余数!=0,则再加上16(N大于16)

    若N<16,则补全为16。

    首先第一题,16个字节占据,第二题,虽然才录入了4个字节的数据,从其余的内存空间为0看来,占用了16个字节,

    听从老师的意见,更改字节数,

    6个字节

    6个字节

    18个字节

     如图所示,可以得出答案,

    N除以16,取整数部分乘16,若余数!=0,则再加上16(N大于16),若N<16,则补全为16。

    3.将下面的程序编译,连接,用debug加载、跟踪,然后回答问题。

    1.CPU执行程序,程序返回前,data段中的数据如上图所示。

    2.CPU执行程序,程序返回前,cs=076AH,ss=076EH,ds=076DH.

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

    4.如果将(1)(2)(3)题中的最后一条伪指令“end start”改为“end”(不指明程序的入口),哪个程序可以正确执行,并说明原因。

    第一个程序

     

    第二个程序

    第三个程序

    综上来看,第三个程序可以正确执行,因为前两个默认代码的入口为data的入口,而第三个开头即为需要的实现代码,通过更改前两个代码data,stack,code的位置即可以成功执行。

    5.程序如下,编写code段中的代码,将a段和b段中的数据依次相加,将结果存到c段中。

    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

    c segment

    db 0,0,0,0,0,0,0,0

    c ends

    code segment

    start:

      mov  bx,0

      mov  cx,8

    s:  mov dx,0(清零操作)

      mov ax,a(阶段一)

      mov ds,a

      add dl.[bx]

      mov ax,b(阶段二)

      mov ds,ax

      add dl,[bx]

      mov ax,c(阶段三)

      mov ds,ax

      mov [bx],dl

      inc bx

    loop s

    mov ax,4c00h

    int 21h

    code ends

    end start

     

    结果正确

    (6)程序如下,编写code段中的代码,用push指令将a段中的前8个字型数据,逆序存储到b段中。

    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 0,0,0,0,0,0,0,0

    b ends

    code  segment

    start:

      mov ax,b(栈的设置)

      mov ss,ax

      mov sp,10h

      mov ax,a(当前代码段地址)

      mov ds,ax

      mov cx,8

      mov bx,0

    s: push [bx](简单的入栈操作)

      add bx,2

      loop s

    mov ax,4c00h

    int ax,21h

    code ends

    end start

     结果正确

     总结:

    通过这6个实验,了解到内存分配的小规律,知道了如何根据段中的数据所占字节,求出实际所需的内存空间,以及end前要标明代码的入口,实验五和实验六教会了我数据的相加和转移,更加熟练掌握了栈的使用方法。

  • 相关阅读:
    Object.assign
    js获取 some方法索引值
    Vue配置sass
    spring MVC,controller中获得resuqest和response的方式
    CentOS7中启动Tomcat后,8080端口不能被外部访问的解决办法。
    spring mvc 中 controller 路径配置
    Spring扫面路径配置不全导致异常 org.apache.ibatis.binding.BindingException: Invalid bound statement (not found): 的原因
    CentOS7中安装MySQL5.7
    eclipse maven web
    用Eclipse进行远程Debug代码
  • 原文地址:https://www.cnblogs.com/-Cold/p/10016696.html
Copyright © 2020-2023  润新知