zoukankan      html  css  js  c++  java
  • 汇编实验五

    一、实验内容-教材133实验 5 

    实验任务(1)~(4),

    直接在教材上填写实验后通过运行、调试观察到的结果,以及由此得 到的结论,以拍照或直接在博客中录入方式,给出填写的结论。

    1)书上P134的源码如下:

    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

    在程序编译、连接完成之后,使用Debug进行调试,依次使用R命令,U命令,G命令,D命令

    观察后可发现,CPU执行程序,程序返回前,data段中的数据没变,仍旧为

    0123h, 0456h, 0789h, 0abch, 0defh, 0fedh, 0cbah, 0987h

    同时也能看出cs=076ch,ss=076bh,ds=076ah,推断出cs、ss、ds之间的规律

    由此可以回答第三问,code段的段地址为X(即cs=X),则data段的段地址为X-2,stack中的段地址为X-1

    2)书上P135源码如下

    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

    在程序编译、连接完成之后,使用Debug进行调试,依次使用R命令,U命令,G命令,D命令

    观察后可发现,CPU执行程序,程序返回前,data段中的数据没变,仍旧为

     0123h, 0456h

    同时也能看出cs=076ch,ss=076bh,ds=076ah,推断出cs、ss、ds之间的规律

    由此可以回答第三问,code段的段地址为X(即cs=X),则data段的段地址为X-2,stack中的段地址为X-1

     对于第四小问,分N分为被16整除和不被16整除讨论 1)当N被16整除时: 占有的空间为(N/16)*16     2)当N不被16整除时: 占有的空间为(N/16+1)*16,N/16得出的是可以整除的部分,还有一个余数,余数肯定小于16,加上一个16。

    程序加载后分配空间是以16个字节为单位的,也就是说如果不足16个字节的也分配16个字节。以上两种情况总结成一个通用的公式:((N+15)/16)*16 【详解参考王爽的课后答案】

    3)书上P135源码如下:

    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

    在程序编译、连接完成之后,使用Debug进行调试,依次使用R命令,U命令,G命令,D命令

    观察后可发现,CPU执行程序,程序返回前,data段中的数据没变,仍旧为

     0123h, 0456h

    同时也能看出cs=076ah,ss=076eh,ds=076dh,推断出cs、ss、ds之间的规律

    由此可以回答第三问,code段的段地址为X(即cs=X),则data段的段地址为X+3,stack中的段地址为X+4

    4)第三个程序仍然可以正确执行,请说明原因???我运行了啊,,,

    “如果不指明入口位置,则程序从所分配的空间开始执行,前2个是数据段,只有从第3条开始是指令代码。”———来自参考答案

    实验任务(5),

    ~(1) 汇编程序源代码(已将此处的段名称由改为c1)

    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,c1
    mov ds,ax
    mov ax,a
    mov es,ax

    mov bx,0
    mov cx,8
    s: mov al,es:[bx]
    mov [bx],al
    inc bx
    loop s

    mov ax,b
    mov es,ax

    mov bx,0
    mov cx,8
    s0: mov al,es:[bx]
    add [bx],al
    inc bx
    loop s0

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

    ~(2) 在debug中调试程序截图,截图中包括如下信息: ① 在实现数据相加前,逻辑段c的8个字节 ② 执行完实现加运算的代码后,逻辑段c的8个字节

    依次使用g命令,d命令,在执行后查看a、b、c段中的存储数据

    再执行倒数第二步,查看c段中此时存储的数据

     

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

     由上图可知,已经实现相加,大概正确吧。

    实验任务(6),

    ~(1) 汇编程序源代码

    assume cs:code
    a segment
        dw 1,2,3,4,5,6,7,8
    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 bx,0    
           mov ss,ax
           mov sp,16  
           mov cx,8
        s: push [bx]
           add bx,2
           loop s     
    code ends
    end start

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

     使用G命令,D命令,执行并查看a段,b段中存储的数据,以及b中最终存储的数据

    ~(3) 根据①和②的调试,验证是否正确的实现数据逆序存储。

     由上图可知,已经实现数据逆序存储。

    二、实验总结

    对于课上讲的“利用栈将程序中定义的数据逆序存放”,没懂为什么要用dw定义16个0,只用8个不可以吗???试了一下好像可以,没出什么问题

    实验任务6中我使用U命令之后出现了一行"CLD",在使用G命令执行时才看到,但是对汇编指令执行没有产生影响

    查阅之后,有这样的解释

  • 相关阅读:
    剑指offer——用两个栈实现队列
    根据前序和中序重建二叉树、后序和中序重建二叉树
    归并排序
    排序
    快速排序(java版)
    List
    单链表的基本操作
    集合
    数组
    结构体
  • 原文地址:https://www.cnblogs.com/kori/p/9999206.html
Copyright © 2011-2022 走看看