1.将下面的程序编译,连接,用debug加载、跟踪,然后回答问题。
根据老师给出的代码,在电脑上自己实现一系列过程
查看代码具体执行到哪个单元。
42h包括了data与stack与输出部分三者所占据的代码字节数,减去即为需要实现的代码数
由于对命令不能做到非常熟悉具体格式的地步,反复尝试了很多次。
1.CPU执行程序,程序返回前,data中的数据为原始数据(入栈出栈的恢复)。
2.CPU执行程序,程序返回前,cs=076CH,ss=076BH,ds=076AH.
3.设程序加载后。code段的段地址为x,则data段的段地址为x-2,stack段的段地址为x-1。
2.再次运用现成的程序段
反汇编得到需要的字节数,查看寄存器的状态。
1.CPU执行程序,程序返回前,data中的数据为16个字节空间,前两个字数据不变,其余为0。
2.CPU执行程序,程序返回前,cs=076CH,ss=076BH,ds=076AH(与上题一致).
3.设程序加载后。code段的段地址为x,则data段的段地址为x-2,stack段的段地址为x-1。
4.对于如下定义的段:
name segment
...
name ends
如果段中的数据占N个字节,则程序加载后,该段实际占有的空间为N除以16,取整数部分乘16,若余数!=0,则再加上16(N大于16)
若N<16,则补全为16。
首先第一题,16个字节占据,第二题,虽然才录入了4个字节的数据,从其余的内存空间为0看来,占用了16个字节,
听从老师的意见,更改字节数,
6个字节
6个字节
18个字节
如图所示,可以得出答案,
N除以16,取整数部分乘16,若余数!=0,则再加上16(N大于16),若N<16,则补全为16。
3.将下面的程序编译,连接,用debug加载、跟踪,然后回答问题。
1.CPU执行程序,程序返回前,data段中的数据如上图所示。
2.CPU执行程序,程序返回前,cs=076AH,ss=076EH,ds=076DH.
3.设程序加载后。code段的段地址为x,则data段的段地址为x+3,stack段的段地址为x+4。
4.如果将(1)(2)(3)题中的最后一条伪指令“end start”改为“end”(不指明程序的入口),哪个程序可以正确执行,并说明原因。
第一个程序
第二个程序
第三个程序
综上来看,第三个程序可以正确执行,因为前两个默认代码的入口为data的入口,而第三个开头即为需要的实现代码,通过更改前两个代码data,stack,code的位置即可以成功执行。
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 bx,0
mov cx,8
s: mov dx,0(清零操作)
mov ax,a(阶段一)
mov ds,a
add dl.[bx]
mov ax,b(阶段二)
mov ds,ax
add dl,[bx]
mov ax,c(阶段三)
mov ds,ax
mov [bx],dl
inc bx
loop s
mov ax,4c00h
int 21h
code ends
end start
结果正确
(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 cx,8
mov bx,0
s: push [bx](简单的入栈操作)
add bx,2
loop s
mov ax,4c00h
int ax,21h
code ends
end start
结果正确
总结:
通过这6个实验,了解到内存分配的小规律,知道了如何根据段中的数据所占字节,求出实际所需的内存空间,以及end前要标明代码的入口,实验五和实验六教会了我数据的相加和转移,更加熟练掌握了栈的使用方法。