从老师邮箱将实验五的相关代码下载下来
(1)将下面的程序编译连接, 用 Debug 加载, 跟踪, 然后回答问题.
- assume cs:code, ds:data, ss:stack
- data segment
- dw 0123h, 0456h, 0789h, 0abch, 0defh, 0fedh, 0cbah, 0987h
- data ends
- stack segment
- dw 0, 0, 0, 0, 0, 0, 0, 0
- stack ends
- code segment
- start mov ax,stack
- mov ss, ax
- mov sp,16
- mov ax, data
- mov ds, ax
- push ds:[0]
- push ds:[2]
- pop ds:[2]
- pop ds:[0]
- mov ax,4c00h
- int 21h
- code ends
- end start
1CPU 执行程序, 程序返回前, data 段中的数据如下图:
2CPU 执行程序, 程序返回前, CS= 076CH ,SS= 076BH ,DS= 076AH
3设程序加载后, CODE 段的段地址为 X, 则 DATA 段的段地址为 X-2 ,STACK 段的段地址为 X-1
因为 code 指的是 cs ,data 指的是 ds ,stack 指的是 ss
由2可知 CS= 076CH ,SS= 076BH ,DS= 076AH
所以 CODE 段的段地址为 X, 则 DATA 段的段地址为 X-2 ,STACK 段的段地址为 X-1
(2)将下面的程序编译连接, 用 Debug 加载, 跟踪, 然后回答问题.
- assume cs:code, ds:data, ss:stack
- data segment
- dw 0123h, 0456h
- data ends
- stack segment
- dw 0, 0
- stack ends
- code segment
- start: mov ax,stack
- mov ss, ax
- mov sp,16
- mov ax, data
- mov ds, ax
- push ds:[0]
- push ds:[2]
- pop ds:[2]
- pop ds:[0]
- mov ax,4c00h
- int 21h
- code ends
- end start
1CPU 执行程序, 程序返回前, data 段中的数据 如下图:
2CPU 执行程序, 程序返回前, CS= 076CH ,SS= 076BH ,DS= 076AH .
3设程序加载后, CODE 段的段地址为 X, 则 DATA 段的段地址为 X-2 ,STACK 段的段地址为 X-1.
同实验(1)
4对于如下定义的段:
- name segment
- ......
- name ends
如果段中的数据占 N 个字节, 则程序加载后, 该段实际占有的空间为 ((N+15)/16)*16
这个问题不会, 所以就百度了, 参考网站: https://bbs.csdn.net/topics/390585699?page=1
相关解释为:
N 分为被 16 整除和不被 16 整除.
当 N 被 16 整除时: 占有的空间为(N/16)*16
当 N 不被 16 整除时: 占有的空间为(N/16+1)*16,N/16 得出的是可以整除的部分, 还有一个余数, 余数肯定小于 16, 加上一个 16.
两种情况总结成一个通用的公式:((N+15)/16)*16
(3)将下面的程序编译连接, 用 Debug 加载, 跟踪, 然后回答问题
- assume cs:code, ds:data, ss:stack
- code segment
- start: mov ax,stack
- mov ss, ax
- mov sp,16
- mov ax, data
- mov ds, ax
- push ds:[0]
- push ds:[2]
- pop ds:[2]
- pop ds:[0]
- mov ax,4c00h
- int 21h
- code ends
- data segment
- dw 0123h, 0456h
- data ends
- stack segment
- dw 0,0
- stack ends
- end start
1CPU 执行程序, 程序返回前, data 段中的数据 如下图:
2CPU 执行程序, 程序返回前, CS= 076AH ,SS= 076EH ,DS= 076DH .
3设程序加载后, CODE 段的段地址为 X, 则 DATA 段的段地址为 X-2 ,STACK 段的段地址为 X-1.
同实验(1)
(4)如果将 (1),(2),(3) 题中的最后一条伪指令 "end start" 改为 "end"(也就是说, 不指明程序的入口), 则哪个程序仍然可以正确执行? 请说明原因.
ex5_1
ex5_2:
ex5_3:
所以只有实验 (3) 是正确的, 原因如下:
当中用于将 end start"改为"end 那么实验 (2)(3) 在实际中将 数据段 和 栈段 对应的的内容当中成了需要执行的代码, 从而导致实验错误.
(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: ;?code ends
- end start
相关思路:
让逻辑段 a 作为数据段(和 ds 关联起来),c 作为附加段(和 es 关联起来);
将逻辑段 a 的 数据→复制到逻辑段 c(可借助 mov 和 loop 实现)
让逻辑段 b 作为数据段(和 ds 关联起来),c 作为附加段(和 es 关联起来);
将逻辑段 b 的 数据加到逻辑段 c(可借助 add 和 loop 实现
(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 8 dup(0)
- b ends
- code segment
- start:
- ;?
- code ends
- end start
来源: http://www.bubuko.com/infodetail-2866508.html