实验 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
- 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
(1)CPU 执行程序, 程序返回前, data 段中的数据为多少?
答: 23 01 56 04 89 07 BC 0A EF 0D ED 0F BA 0C 87 09
(2)CPU 执行程序, 程序返回前, cs=076C,ss=076B,ds=076A.
(3)设程序加载后, code 段的段地址为 X, 则 data 段的段地址为 X-2,stack 段的段地址为 X-1.
实验 2
将下面的程序编译, 连接, 用 Debug 加载, 跟踪, 然后回答问题.
(1)CPU 执行程序, 程序返回前, data 段中的数据为多少?
答: 23 01 56 04 00 00 00 00 00 00 00 00 00 00 00 00
(2)CPU 执行程序, 程序返回前, cs=076C,ss=076B,ds=076A.
(3)设程序加载后, code 段的段地址为 X, 则 data 段的段地址为 X-2,stack 段的段地址为 X-1.
(4)对于如下定义的段:
- name segment
- ...
- name ends
如果段中的数据占 N 个字节, 则程序加载后, 该段实际占用的空间为(N/16+1)*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
(1)CPU 执行程序, 程序返回前, data 段中的数据为多少?
答: 23 01 56 04 00 00 00 00 00 00 00 00 00 00 00 00
(2)CPU 执行程序, 程序返回前, cs=076A,ss=076E,ds=076D.
(3)设程序加载后, code 段的段地址为 X, 则 data 段的段地址为 X+3,stack 段的段地址为 X+4.
实验 4
如果将 (1),(2),(3) 题中的最后一条伪指令 "end start" 改为 "end"(也就是说, 不知名程序的入口), 则哪个程序仍然可以正确执行? 请说明原因
- 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 ax,a
- mov ds,ax
- mov ax,c
- mov es,ax
- mov bx,0
- mov cx,8
- s1: mov al,ds:[bx]
- mov es:[bx],al
- inc bx
- loop s1
- mov ax,b
- mov ds,ax
- mov bx,0
- mov cx,8
- s2: mov al,ds:[bx]
- add es:[bx],al
- inc bx
- loop s2
- mov ax,4c00h
- int 21h
- code ends
- end start
实验一
实验二
实验三
经过比较发现: 实验 1,2 不能正确执行, 实验 3 仍然可以正确执行.
原因: end start 变成 end, 说明不指明程序入口, 程序默认从 IP=0 处执行; 实验 3 是代码段在前, 而实验 1,2 是代码段在后, 说明实验 3 中 IP=0 时就可以执行代码段的内容. 所以实验 3 仍可以正确执行.
实验 5
- 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 ax,a
- mov ds,ax
- mov ax,c
- mov es,ax
- mov bx,0
- mov cx,8
- s1: mov al,ds:[bx]
- mov es:[bx],al
- inc bx
- loop s1
- mov ax,b
- mov ds,ax
- mov bx,0
- mov cx,8
- s2: mov al,ds:[bx]
- add es:[bx],al
- inc bx
- loop s2
- mov ax,4c00h
- int 21h
- code ends
- end start
1 在实现数据相加前, 逻辑段 c 的 8 个字节: 00 00 00 00 00 00 00 00
2 执行完实现加运算的代码后, 逻辑段 c 的 8 个字节: 02 04 06 08 0A 0C 0E 10
3. 根据1和2的调试, 实验程序正确实现数据相加
实验 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,a
- mov ds,ax
- mov ax,b
- mov bx,0
- mov ss,ax
- mov sp,16
- mov cx,8
- s: push [bx]
- add bx,2
- loop s
- mov ax,4c00h
- int 21h
- code ends
- end start
来源: http://www.bubuko.com/infodetail-2883479.html