检测点 6.1
(1)下面的程序实现依次使用内存 0:0~0:15 单元中的内容改写程序中的数据,完成程序:
assume cs:codesg
codesg segment
dw 0123h,0456h,0789h,0abch,0defh,0fedh,0cbah,0987h
start:
mov ax,0
mov ds,ax
mov bx,0
mov cx,8
s:
mov ax,[bx]
___________
add bx,2
loop s
mov ax,4c00h
int 21h
codesg ends
end start
分析:
由 mov ax,0 ;mov ds,ax ;mov bx,0 可知数据段指针指向的是内存 0:0 位置
mov cx,8 表示要循环 8 次 将 内存 0:0~0:15 单元中的内容改写程序中的数据
即每次改写 1 个字
由循环中 mov ax,[bx] 可知先将 0:0~0:15 单元中的8个字依次先存放到AX中,然后将数据存放到 cs:[bx] 指向的位置。
故空行处应该填写 mov cs:[bx],ax
(2) 下面的程序实现依次用内存 0:0~0:15 单元中的内容改写程序中的数据,数据的传送用栈来执行,栈空间设置在程序内。完成程序:
assume cs:codesg
codesg segment
dw 0123h,0456h,0789h,0abch,0defh,0fedh,0cbah,0987h
dw 0,0,0,0,0,0,0,0,0,0 ;10个子单元用作栈空间
start:
mov ax,_____
mov ss,ax
mov sp,_____
mov ax,0
mov ds,ax
mov bx,0
mov cx,8
S:
push [bx]
____________
add bx,2
loop s
mov ax,4c00h
int 21h
codesg ends
end start
分析:
数据部分:
数据(字) | 0123h | 0456h | 0789h | 0abch | 0defh | 0fedh | 0cbah | 0987h |
偏移量 | 00H | 02H | 04H | 06H | 08H | 0AH | 0CH | 0EH |
栈部分:
数据(字) | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
偏移量 | 10H | 12H | 14H | 16H | 18H | 1AH | 1CH | 1EH | 20H | 22H |
由程序可知,所有数据、栈、代码都以一个代码段地址为基准,每次循环将内存中的一个字先放入栈段,再将数据出栈放入数据段。
故第一空填写:mov ax,cs
初始栈为空,栈顶地址为 CS:24h,故sp = 24h。
故第二空填写:mov sp,24h
将栈中数据弹出放入数据段
故第三空填写:pop cs:[bx]