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


    一、练习一

    代码如下:

    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

    ①CPU执行程序,程序返回前,data段中的数据为:0123h,0456h,0789h,0abch,0defh,0fedh,0cbah,0987h

    ②CPU执行程序,程序返回前,cs=076ch、ss=0769h、ds=075ah

    ③设程序加载后,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

    ①CPU执行程序,程序返回前,data段中的数据为:0123h,0456h

    ②CPU执行程序,程序返回前,cs=076ch、ss=0769h、ds=075ah

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

    ④对于如下定义的段:

    name segment

    ...

    name ends

    如果段中的数据占N个字节,则程序加载后,该段实际占有的空间为[(N+15)/16]*16

    解题思路:开辟栈空间时以16个字节为单位,所以栈的大小为16字节的整数倍。

     

    三、练习三

    实验代码如下:

    assume cs:code,ds:data,ss:stack
    
    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
    
    data segment
            dw 0123h,0456h
    data ends
    
    stack segment
            dw 0,0
    stack ends
    
    end start

    ①CPU执行程序,程序返回前,data段中的数据为:0123h,0456h,0789h,0abch,0defh,0fedh,0cbah,0987h

    ②CPU执行程序,程序返回前,cs=076ch、ss=0769h、ds=075ah

     

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

     

    四、练习四

    将最后一条伪指令end start改为end后练习一、二不能正确运行,练习三可以。

    因为将end start用于指明程序的入口,由其指明的入口在编译、连接后被转化为一个入口地址,程序由该地址开始执行。

    删去start后程序默认从第一个段开始执行,而只有练习三的代码段为第一个段,所以只有练习三可以正确运行。

     

    五、练习五

    编写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 ax,a
            mov ds,ax
            mov bx,0
            mov cx,8
    s:      mov al,[bx]
            add al,[bx+10h]
            mov [bx+20h],al
            inc bx
            loop s
    
            mov ax,4c00h
            int 21h
    code ends
    end start

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

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

    经验证,已正确实现数据相加。

     

    六、实验六

    编写code段中的代码,用push指令将a段中的前八个字型数据,逆序存储到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,a
            mov ds,ax
    
            mov ax,b
            mov ss,ax
            mov sp,16        
    
            mov cx,8
            mov bx,0
    
    s:      push [bx]
            add bx,2
            loop s
    
            mov ax,4c00h
            int 21h
    code ends
    end start

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

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

    经验证,已成功实现逆序存储。

     

    思考与总结:

    这次实验使我更深一步的了解了计算机内部运行程序时各指针的变化。本章内容虽然不多,但实际操作起来还是比较繁琐的。

     

  • 相关阅读:
    【ecshop】 完全清除版权信息
    【ecshop】使用sql 清除测试数据
    Java异常处理:给程序罩一层保险
    想清楚你究竟想成为什么样的人了吗?
    Java集合类的那点通俗的认知
    2019年的第一天,我给自己定了一份读书计划
    Java的内部类真的那么难以理解?
    29岁了还一事无成是人生的常态?
    Java接口的实例应用:致敬我的偶像——何塞·穆里尼奥
    程序员年底众生相
  • 原文地址:https://www.cnblogs.com/wlxnw/p/10016067.html
Copyright © 2020-2023  润新知