汇编语言第一次实验

实验任务2

8086CPU的C0000~FFFFF 地址空间为只读存储器,无法被修改。

 

实验任务3

使用e命令,向内存单元填写数据:
-e b800:0 03 04 03 04 03 04 03 04 03 04

 

使用f命令,向内存单元批量填写数据:
-f b800:0f00 0f9f 03 04 

 

  

 

实验任务4

填空:

 1 -a
 2 mov ax, 20
 3 mov ds, ax
 4 mov ss, ax
 5 mov sp, 30
 6 push [0] ; 执行后,寄存器(sp) = 002EH
 7 push [2] ; 执行后,寄存器(sp) = 002CH
 8 push [4] ; 执行后,寄存器(sp) = 002AH
 9 push [6] ; 执行后,寄存器(sp) = 0028H
10 pop [6] ; 执行后,寄存器(sp) = 002AH
11 pop [4] ; 执行后,寄存器(sp) = 002CH
12 pop [2] ; 执行后,寄存器(sp) = 002EH
13 pop [0] ; 执行后,寄存器(sp) = 0030H

 

问题1:栈顶的逻辑地址为20:30,物理地址为0230H

问题2:

 问题3:

问题4:

 

实验任务5

问题1:单步执行mov ss,ax后并没有暂停。由于此指令修改了段寄存器,之后的一条指令mov sp,30也紧随着执行了。

问题2:实际栈空间的使用并非简单的依次压入数据。并且进行某些操作后,栈中会存放当前指令的段地址和偏移地址。

 

实验任务6

实验源码:

 汇编及链接:

 执行结果:

查看程序段前缀:

 验证得程序段前缀前两个字节是CD 20。且程序段前缀中存储了程序名。

 

实验任务7

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

程序将要完成的功能是复制部分自身代码至内存0:200开始的连续内存单元。代码实现的功能是将内存单元ds:[bx]处开始的数据复制至内存单元es:[bx]处。因此第一空填cs,将程序段首地址信息送入段寄存器ds中;第二空的数字即复制字节的循环次数,使用debug调试程序知被复制代码的长度为23字节,因此填23。

用g命令运行部分代码和使用u命令反汇编0:200处内存空间数据:

 发现程序确实被复制到了0:200处的内存空间。

posted @ 2021-10-22 10:04  T1lAM1lSU  阅读(90)  评论(4)    收藏  举报