zoukankan      html  css  js  c++  java
  • 实验5 编写、调试具有多个段的程序

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

    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

     

    (1)CPU执行程序,程序返回前,data段中的数据为0123h

    (2)CPU执行程序,程序返回前,CS=076c、SS=076b、DS=076a。

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

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

    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
          

    (1)CPU执行程序,程序返回前data段中的数据为0123h

    (2)CPU执行程序,程序返回前,CS=076c、SS=076b、DS=076a。

    (3)设程序加载后,code段的段地址为X,则data段中的段地址为X-2,stack段的段地址为X-1。

    (4)对于如下定义的段:

    name segment

    ...

    name ends

    如果段中的数据占N个字节,则程序加载后,该段实际占有的空间为

    N<=16时,占有的空间为16字节,N>16时,占有的空间为[N/16]*16

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

    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

    (1)CPU执行程序,程序返回前,data段中的数据为0123h

    (2)CPU执行程序,程序返回前,CS=076a、SS=076e、DS=076d

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

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

    虽然实验1、2都能通过汇编、连接、运行,但是反汇编后出现了令人看不懂的指令

    实验3可以正确执行

    从表面上看,3个实验的差异是实验3将代码段写在数据段和栈段之后,第1、2个实验数据段和栈段不是有效指令,如果不指定代码段入口,CPU会把数据当作指令来通过CS:IP指向。

    (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 ax,a
              mov ds,ax
              mov ax,c
              mov es,ax
              mov bx,0
              mov cx,8
    
    
         s:   mov al,ds:[bx]
              mov es:[bx],al
              inc bx
              loop s 
    
    
              mov ax,b
              mov ds,ax
              mov bx,0
              mov cx,8
    
    
        s0:    mov al,ds:[bx]
               add es:[bx],al
               inc bx
               loop s0
             mov ax,4c00h
    int 21h
    code ends end start

     

    add操作执行前

    add操作执行后

    (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 bx,0
              mov cx,8
    
        s:   push [bx]
              add bx,2
              loop s

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

     

     push操作执行前

    push操作执行后

    总结与体会

    完成实验5时,老师给出了分阶段使用ds的方法,感觉这是这次实验最大的收获。

  • 相关阅读:
    case when then 中判断null的方法
    在SELECT的时候,加入一列固定值
    拿到iframe页面里面的变量及元素的方法
    datatables 多一列报错Cannot read property 'sWidth' of undefined(…)/少一列报错Cannot read property 'style' of undefined(…)
    MySQL 显示表字段及注释等信息
    MYSQL escape用法--转义
    MyBatis insert操作返回主键
    Java关键字final、static使用总结
    数据库往表中插入数据报错
    洛谷 题解 P1287 【盒子与球】
  • 原文地址:https://www.cnblogs.com/547hh/p/9998598.html
Copyright © 2011-2022 走看看