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

1.  实验任务1

 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工具汇编、链接的命令行及运行结果截图:

 

 

使用debug调试的截图:

 

 

 

  • 结合可执行文件加载后寄存器CX的值,使用u命令精确反汇编截图查看PSP的命令及截图:

     

     

  • 使用g命令执行到line16退出执行之前,操作截图

     

     

     

     

 

2.  实验任务2

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

 

使用masm、link工具汇编、链接的命令行及运行结果截图:

 

 

使用debug调试的截图:

  • 结合可执行文件加载后寄存器CX的值,使用u命令精确反汇编截图
  • 灵活使用t命令/p命令、g命令,对ex2.exe进行调试的截图(不一定要单步,有些地方可以用g命令,一次执行多行汇编指令)
  • 调试
  • t命令用于跳过一般命令,在面对loop,int时会进入对应的子程序段内部
  • p命令会将子程序在主程序中当成一个整体来运行,当不想看见子程序内部具体运行结果时,使用p命令是一个更加合理的选择;

编译、连接、运行

 

 

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

 

 

 

回答问题

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

 

答: 两者实现效果相同,都是对内存中的同一块内存单元写入相同的一组值;

  具体实现上:ex1.asm 是通过直接在对应的内存单元写值的方式来进行对内存单元的修改;

        ex2.asm是通过loop指令循环来实现对对应内存的修改;

3.  实验任务3

  • 源代码
assume cs:code
code segment
    mov ax,0b800h
    mov ds,ax

    mov bx,07b8h
    mov cx,16
s:    mov ax,0237h
    mov [bx],ax
    add bx,2
    loop s

    mov ax,4ch
    int 21h
code ends
end

 

  • 运行结果截图

 

 

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

     

     

  2. 填充数据改为0437H

     

     

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

答:高两位表示的是颜色信息;低两位用于标识显示的字符形状;

4.  实验任务4

源代码

 

assume cs:code
code segment
    mov ax,0020h
    mov ds,ax

    mov bx,0
    mov cx,64
s:    mov [bx],bl
    inc bx
    loop s

    mov ax,4c00h
    int 21h
code ends
end

 

汇编、链接无误后,灵活使用debug的t命令、g命令、p命令调试,用d命令查看0:200~0:23F,确  认是否将0~63传送至此段内存区域。这部分,要求有截图。

 

 

调试

 

 

 使用p命令跳过loop指令

 

 

 

 

 上图可以说明0~3f已经传至对应的内存单元;

5.  实验任务5

源代码

assume cs:code
  code segment 
    mov ax,cs
    mov ds,ax
    mov ax,0020h
    mov es,ax
    mov bx,0
    mov cx,17h

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

    mov ax,4c00h
    int 21h
code ends
end

 

汇编连接后,灵活使用debug的t命令、g命令、p命令调试,用d命令查看0:200之后的若干字节, 观察是否将mov ax, 4c00h之前的指令复制到指定内存,这部分要求有截图,并以文字方式说明空白处填写依据。

通过尝试值的方法来确定用于复制的代码段的长度,由此来确定ax的值;

 

根据上图,将cx改为17h后再汇编、链接、运行、debug

分析用:D命令查看,发现已经复制到指定内存

posted @ 2020-11-06 11:02  热心市民朱同学  阅读(115)  评论(2编辑  收藏  举报