• 实验2 汇编源程序编写与汇编、调试


    1. 实验任务1

    使用任意一款文本编辑器,编写8086汇编源程序ex1.asm。

     1 ;ex1.asm
     2 assume cs:code
     3 code segment
     4   mov ax, 0b810h
     5   mov ds, ax
     6   mov byte ptr ds:[0], 1
     7   mov byte ptr ds:[1], 1
     8   mov byte ptr ds:[2], 2
     9   mov byte ptr ds:[3], 2
    10   mov byte ptr ds:[4], 3
    11   mov byte ptr ds:[5], 3
    12   mov byte ptr ds:[6], 4
    13   mov byte ptr ds:[7], 4
    14   mov ah, 4ch
    15   int 21h
    16 code ends
    17 end

    使用masm、link对ex1.asm进行汇编、链接,得到可执行文件ex1.exe,运行并观察结果。

    使用debug加载可执行文件ex1.exe后,使用d命令查看程序段前缀PSP所占的256个字节。

    结合可执行文件中寄存器CX的值,使用u命令对ex1.exe进行精确反汇编

    使用g命令执行到程序退出执行之前(即源码文件中line16之前),观察结果。

    此处,第一次并没有将数据送入目标内存,但ex1.exe这个文件运行时正常,猜测:是屏幕回滚的原因,因为第二次直接查看效果是可以得到的

     

    2. 实验任务2

    ex2.asm源码

     1 ; ex2.asm
     2 assume cs:code
     3 code segment
     4   mov ax, 0b810h
     5   mov ds, ax
     6   mov bx, 0
     7   mov ax, 101H
     8   mov cx, 4
     9 s: mov [bx], ax
    10   add bx, 2
    11   add ax, 101H
    12   loop s
    13   mov ah, 4ch
    14   int 21h
    15 code ends
    16 end 

    使用masm.link工具汇编,链接的命令及运行结果

    结合可执行文件中寄存器CX的值,使用u命令对ex2.exe进行精确反汇编

    灵活使用t命令、p命令、g命令,对ex2.exe进行调试。

    注意:单步调试时,对于循环指令loop, 中断指令int,使用t命令和p命令单步调试的区别。

    把ex2.asm中line9 mov cx, 4 改成 mov cx, 8 ,保存后重新汇编、链接、运行并观察结果。

    结合上述实验和观察,分析、对比ex2.asm和ex1.asm,它们实现的是否是相同的功能和效果?在具体实现上有什么不同?

    答:两者效果相同,但实现方式不同,ex1.asm是将一步步将数据放入指定内存,ex2.asm利用loop和[bx]指令,大大缩短了重复代码,并且易于更改,如:只需改变步长,便可增加图形显示

     3. 实验任务3

    综合使用loop,[bx],编写完整汇编程序,实现向内存b800:07b8开始的连续16个字单元重复填充字数据 0237H。

     1 ;ex3.asm
     2 assume cs:code
     3 code segment
     4         mov ax,0b800H
     5         mov ds,ax
     6 
     7         mov bx,7b8H
     8         mov ax,0237H
     9         mov cx,10H
    10 s:      mov [bx],ax
    11         add bx,2
    12         loop s
    13 
    14         mov ah,4ch
    15         int 21h
    16 code ends
    17 end

    把填充的字数据,从0237H 改成0239H,再次保存后,汇编、链接、运行,观察结果。

    把填充的字数据,从0237H 改成0437H,再次保存后,汇编、链接、运行,观察结果。

    猜测并分析,这个字数据中高位字节里存放的是什么信息,低位字节里存放的是什么信息。

    高字节存放颜色信息,低字节存放内容信息

    4. 实验任务4

    编写完整汇编源程序,实现向内存0:200~0:23F依次传送数据0~63(3FH)。

    1)综合使用[bx]和loop,编写汇编源程序

     1 ;ex4.asm
     2 assume cs:code
     3 code segment
     4     mov ax,0020h
     5     mov ds,ax
     6 
     7     mov bx,0H
     8     mov ax,0H
     9     mov cx,64
    10 s:  mov [bx],al
    11     inc bx
    12     inc ax
    13     loop s
    14 
    15     mov ah,4ch
    16     int 21h
    17 code ends
    18 end

    灵活使用debug的t命令、g命令、p命令调试。在程序退出前,用d命令查看 0:200~0:23F,确认是否将0~3F传送至此段内存区域。

     

    2)利用栈的特性,综合使用loop,push实现(限定仅使用8086中已学过指令实现),编写源程序

     1 ;ex4_.asm
     2 assume cs:code
     3 code segment
     4     mov ax,0020h
     5     mov ss,ax
     6     mov sp,0040h
     7 
     8     mov bh,3fH
     9     mov bl,3eH
    10     mov cx,64
    11 s:  push bx
    12     add bh,-2h
    13     add bl,-2h
    14     loop s
    15 
    16     mov ah,4ch
    17     int 21h
    18 code ends
    19 end

    灵活使用debug的t命令、g命令、p命令调试。在程序退出前,用d命令查看 0:200~0:23F,确认是否将0~3F传送至此段内存区域。

     

    5. 实验任务5

    将“mov ax,4c00h"之前的指令复制到内存0:200处,补全程序

     1 ;ex5.asm
     2 assume cs:code
     3 code segment
     4     mov ax,cs
     5     mov ds,ax
     6     mov ax,0020h
     7     mov es,ax
     8     mov bx,0
     9     mov cx,23
    10 s:  mov al,[bx]
    11     mov es:[bx],al
    12     inc bx
    13     loop s
    14 
    15     mov ax,4c00h
    16     int 21h
    17 code ends
    18 end

    1)复制的是什么,从哪里到哪里

    复制字节数据,从cs代码段到ds数据段,即0:200处

    2)复制的是什么,有多少个字节,如何知道要复制的字节数量

     字节数量要看代码占多少字节,如果熟悉代码可以直接计算,我是先假设有多少字节,然后反汇编查看代码再计算

  • 相关阅读:
    参数传递(值传递与引用传递)
    存入redis中的java对象都需要序列化
    windows环境Apache服务器启动失败的原因
    IDEA/Eclipse安装 Alibaba Java Coding Guidelines 插件
    使用freemarker对模板进行渲染
    java使用freemarker作为模板导出Excel表格
    mybatis 中 foreach collection的三种用法
    利用freemarker导出页面格式复杂的excel
    mysql limit和offset用法
    设计模式之二十一:中介者模式(Mediator)
  • 原文地址:https://www.cnblogs.com/zuiyankh/p/13924209.html
Copyright © 2020-2023  润新知