参考:http://blog.sina.com.cn/s/blog_171daf8e00102xclx.html
(1)将下面的程序编译连接,用Debug加载、跟踪,然后回答问题。
assume cs:code, ds:data, ss:stack data segment stack segment code segment start: mov ax,stack mov ax,data push ds:[0] mov ax, 4c00h code ends end start
0123h, 0456h, 0789h, 0abch, 0defh, 0fedh, 0cbah, 0987h 数据段的8个字,按照小尾端存储 0,0,0,0,0,0,0,0 栈段的8个字
ds:00~ds:100H是留给程序与操作系统通讯使用的psp内存段 ds:100 = 075A:100 = 076A:0 数据段 ds:110 = 075A:110 = 076B:0 栈段
sp = 0010,指向栈顶,栈是从高地址向低地址增长的
我们看到0123已经入栈,并且此时sp = 000e
①CPU执行程序,程序返回前,data段中的数据 不变 。 ②CPU执行程序,程序返回前,CS=076C,SS=076B,DS=076A 。(根据自己系统回答) ③设程序加载后,CODE段的段地址为X,则DATA段的段地址为 X-2 ,STACK段的段地址为 X-1
|
(2)将下面的程序编译连接,用Debug加载、跟踪,然后回答问题。
assume cs:code, ds:data, ss:stack data segment stack segment code segment start: mov ax,stack mov ax,data push ds:[0] mov ax, 4c00h code ends end start
首先明确:虽然我们在data段和stack段中只定义初始化了4个字节的内存,但在汇编中,直接给你分配了16个字节的空间,不足的按00补全。 结论:数据段和栈段在程序加载后实际占据的空间都是以16个字节为单位的。如果不足,以0补全填充。
①CPU执行程序,程序返回前,data段中的数据为多少? 执行程序后,data段有16个字节空间,前两个字数据不变,其余为00补全了。 ②CPU执行程序,程序返回前,CS=076C,SS=076B,DS=076A 。(根据自己系统回答) ③设程序加载后,CODE段的段地址为X,则DATA段的段地址为 X-2 ,STACK段的段地址为 X-1 对于如下定义的段: name segment ...... name ends 如果段中数据位N个字节,程序加载后,该段实际占据空间为:(N/16的取整数+1)*16个字节 如果N小于16,那么实际占用16个字节(理解这个小问题);如果N大于16,那么实际占用(N/16的取整数+1)*16个字节。其实都是这个公式。 |
(3)将下面的程序编译连接,用Debug加载、跟踪,然后回答问题。
assume cs:code, ds:data, ss:stack code segment start: mov ax,stack mov ax,data push ds:[0] mov ax, 4c00h code ends data segment stack segment end start
①CPU执行程序,程序返回前,data段中的数据为多少? 执行程序后,data段有16个字节空间,前两个字数据不变,其余为00补全了。 ②CPU执行程序,程序返回前,CS=076A,SS=076E,DS=076D 。(根据自己系统回答) ③设程序加载后,CODE段的段地址为X,则DATA段的段地址为 X+3 ,STACK段的段地址为 X+4
(为什么是这样?怎么计算的?看cx,程序加载时,我们发现cx=0044,含义:此程序所有机器码占用的空间是44H=68字节,data和stack由于定义的都是小于16个字节,一律按照16个字节分配空间,其余补00;剩余的36个字节就是code段真正的可执行的机器码。由于code段不足48个字节(3*16),故程序加载时也补0了) 我们可以使用debug看看: 前三行是代码段 第四行是数据段 第五行是栈段 没有执行指令之前,cx = 0044,这个是所有程序的大小,包括了代码段、数据段和栈段。
|
(5)(6)看参考博客 http://blog.sina.com.cn/s/blog_171daf8e00102xclx.html 自己简单思考了一下,懒得写了 记住: db 要用 mov al, [bx] dw 要用 mov ax, [bx]
|