(1)将所给的程序编译连接,用Debug加载、跟踪,然后回答问题。
源代码书本已给出,故在此不展示,调试程序。

<1>cpu执行程序,程序返回前,data段中的数据是多少?
0123h,0456h,0789h,0abch,0defh,0fedh,0cbah,0987h,可以发现数据并没有改变。
<2>cpu执行程序,程序返回前,cs=076Ch, ss=076Bh, ds=076Ah
<3>设程序加载后,code段的地址为X,则data段的地址 X-2,stack段为X-1。
(2)将所给的程序编译连接,用Debug加载、跟踪,然后回答问题。
这题和题目一差不多,只不过这边是2个数据。

<1>cpu执行程序,程序返回前,data段中的数据为多少?
0123h,0456h,也和原来一样。
<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向下取整(即如果N为17则取1)*16 + 16, 即 ([N/16] + 1)*16。
因为这边每段之间相隔一个地址即如果 a段的地址为 076A, 则b段的地址为076B, 当然a段的字节数不能超过16,入超过哪怕只是1个字节,那b 就变成076C。
(3)将所给的程序编译连接,用Debug加载、跟踪,然后回答问题。
和前面两题差不多。

<1>CPU执行程序,程序返回前,data段中的数据为多少?
0123h, 0456h, 和原来的一样。
<2>CPU执行程序,程序返回前,cs=076Ah,ss=076Eh,ds=076Dh.
<3>设程序加载后,code段的短地址为X,则data段的短地址为__X+3__,stack段的短地址为__X+4__。
(4)如果将(1),(2),(3)题中的最后一条伪指令end start改为end(也就是说,不指明程序的入口个),则哪个程序仍然可以正确执行?请说明原因。
第三给程序能够正确的运行,因为当不指明程序的入口时,cs:code segment的默认ip为0,第三个程序在ip为0时正好对应程序的开始的地方,前面的两个ip对应的是存数据的地方故会错。

如图所示,这是第一题的代码,数据为data dw写入的数据。故解析指令的时候出错。
(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 ax, a
mov ds, ax
mov bx, 0
mov cx, 8
s: mov dl, ds:[bx]
add dl, ds:[bx+16]
mov ds:[bx+32], dl
add bx, 1
loop s
mov ax, 4c00h
int 21h
code ends
end start

这里直接用ds+16, 利用了上面的实验推出的结论, 不同段之间相差1,即16个字节,这样省去将b的地址也存下然后相加的过程,可以看到成功将a,b的数据对应一一相加存入到c中。
(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 ss, ax
mov sp, 10h
mov bx, 0
mov cx, 8
s: push ds:[bx]
add bx, 2
loop s
mov ax, 4c00h
int 21h
code ends
end start
因为栈要分配16个字节,即ss:0~ss:f,而在栈空时栈指针sp应该指向栈底的下一个单元即为ss:10h,所以赋值sp为10h。令循环次数cx为8,执行循环s,实现用push指令将a段中的前8个字型数据,逆序存储到b段中。

用d查看后,可以发现我们成功。
浙公网安备 33010602011771号