• 实验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的方法,感觉这是这次实验最大的收获。

  • 相关阅读:
    XSS跨站脚本攻击实例讲解,新浪微博XSS漏洞过程分析
    PHP常量PHP_SAPI与函数php_sapi_name()简介,PHP运行环境检测
    PHP导出数据到CSV文件函数/方法
    iOS8 Core Image In Swift:视频实时滤镜
    实战:mysql版本号升级
    Apache Shiro 使用手冊 链接文件夹整理
    Windows 驱动开发
    Python标准库:内置函数bytearray([source[, encoding[, errors]]])
    cocos2d-x 2.2.3 之菜单分析(1)
    JSP具体篇——out
  • 原文地址:https://www.cnblogs.com/547hh/p/9998598.html
Copyright © 2020-2023  润新知