8086汇编-31包含多个段的程序03

#pragma once
/*    31-包含多个段的程序03

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

    这一章的理论内容不是很多,但有些知识却是要在实践中掌握。这个实验,既是一次实践,也是学习内容。必须完成这个实验,才能继续向下学习。
    (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

                   ① CPU执行程序,程序返回前,data段中的数据为多少?                
                        依旧如此,不会发生改变.

                   ② CPU执行程序,程序返回前,cs=__、ss=__、ds=__?   
                        cs =code地址 ,ss= stack地址, ds= data 地址,具体的数值不同机器有不同的数值.    完全没有变化过.

                   ③ 设程序加载后,code段的段地址为X,则data段的段地址为__,stack段的段地址为__.    
                        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。


                    ① CPU执行程序,程序返回前,data段中的数据为多少?    
                        数据不会改变.

                    ② CPU执行程序,程序返回前,cs=__、ss=__、ds=__?
                        cs =code地址 ,ss= stack地址, ds= data 地址,具体的数值不同机器有不同的数值.    完全没有变化过.

                    ③ 设程序加载后,code段的段地址为X,则data段的段地址为,stack段的段地址为
                        data段的段地址为 X-2,stack段的段地址为X-1. 因为在同一个程序中,这些地址都是连续的.    一个段最小为16 个字节!!!

                    ④对于如下定义的段:
                        name segment
                            ...
                        name ends
                    
                        如果段中的数据占N个字节,则程序加载后,该段实际占有的空间为_____?    
                            该段实际占有的空间为    16*(N/16+1),    N/16 求的是 有多少个16字节的最小段, +1 是避免超出部分,毕竟没有半个段一说. 再 乘 外面的 16, 是将 括号内(N/16+1)得到的最小段数量 乘 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


            ① CPU执行程序,程序返回前,data段中的数据为多少?
                数据不会改变.

            ②CPU执行程序,程序返回前,cs=__、ss=__、ds=__.
                cs =code地址 ,ss= stack地址, ds= data 地址,具体的数值不同机器有不同的数值.    完全没有变化过.

            ③设程序加载后,code段的段地址为X,则data段的段地址为__,stack段的段地址为__.
                data段的段地址为 X+3,stack段的段地址为X+4. 因为在同一个程序中,这些地址都是连续的.    一个段最小为16 个字节!!! 而且,因为编译顺序的原因,该两个段声明在code 段后面,所以变成了+.

    (4)如果将(1)、(2)、(3)题中的最后一条伪指令"end start”改为"end”(也就是说,不指明程序的入口),则哪个程序仍然可以正确执行?请说明原因。
            第3个程序.因为 3个程序中开始的时候没有声明 其他段,也就不会被把声明 的代码 错误的当成 执行代码.
    (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:
                ????

        code ends
        end start


            答案:
              

 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 0,0,0,0,0,0,0,0
                c1 ends
        
                code segment
                    start:mov ax,c1
                          mov ds,ax

                          mov ax,a
                          mov es,ax

                          mov bx,0
                          mov cx,8

                       s0:mov al,es:[bx]
                          mov [bx],al
                          inc bx
                          loop s0
          

                          mov ax,b
                          mov es,ax

                          mov bx,0
                          mov cx,8

                       s1:mov al,es:[bx]
                          add [bx],al
                          inc bx
                          loop s1

                          mov ax,4c00H
                          int 21H
                code ends
                end start

                    这道题本身就有错误,c段,应该改为其他名称,因为c 是关键字,不能作为段!!!!!

    (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:
                ????
        code ends
        end start
                


                答案:
                  

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

                              mov ax,a
                              mov ds,ax

                              mov bx,0
                              mov cx,8

                            s:push ds:[bx]
                              add bx,2
                              loop s

                              mov ax,4c00H
                              int 21H
        
                    code ends
                    end start


*/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值