检测点6.1
(1.)下面的程序实现依次用内存0:0~0:15单元中的内容改写程序中的数据,完成程序:
程序分析:
目的:是将内存0000:0000H~0000:000fH中的数据,把在代码段寄存器中定义的数据改写。
内存0000:0000H~0000:000fH可以用ds段寄存器存储0000的段地址了。(ds)=0
bx寄存器依然用作偏移地址的偏移量,[bx]作为内存单元。
注意cs:[bx](其中bx范围是0-15)表示了代码段指向的内存单元前16个字节内存空间。注意cs:[16]就是真正的CPU执行的代码(机器码)
代码如下:
assume cs:codesg
codesg segment
dw
0123H,0456H,0789h,0abch,0defh,0fedh,0cbah,0987h
start:
mov
ax,0
mov
ds,ax
;ds指向了0000段内存。
mov
bx,0
;bx偏址变量置零
mov
cx,8
;要读取并改写8次,(cx)=8
s:
mov
ax,[bx]
;将ds:[bx]内存单元内容送入ax中
mov
cs:[bx],ax
;将ax值回写到code段的前16个字节单元中
add
bx,2
loop
s
mov
ax,4c00H
int
21H
codesg ends
end start
结果分析:
首先再次认识到,在一个程序中(真正的),除了可执行代码(机器码)外,数据可以存储在任意的段中。也就是在此程序中,我们发现16个字节的数据定义在了代码段中了。
编译连接后,debug:
程序开始时:
-d cs:0
0B65:0000 23 01 56 04 89 07 BC 0A-EF 0D ED 0F BA 0C 87 09
#.V.............
0B65:0010 B8 00 00 8E D8 BB 00 00-B9 08
00 8B 07 2E 89 07
................
0B65:0020 83 C3 02 E2 F6 B8 00 4C-CD 21
03 00 02 00 01 00
.......L.!......
程序运行至mov ax,4c00H时,我们查看结果:
在00:00 0f内存中
-d 00:00 0f
0000:0000 68 10
A7 00 BB 13 68 05-16 00 9E 03 B1 13 68
05
h.....h.......h.
在cs:00 0f内存中,已经将原来的数据改写了。
-d cs:00 0f
0B66:0000 68 10
A7 00 BB 13 68 05-16 00 9E 03 B1 13 68
05
h.....h.......h.
2.
下面的程序实现依次用内存0:0~0:15单元中的内容改写程序中的数据,数据的传送用栈来进行。栈空间设置在程序内。完成程序:
程序分析:
目的:是将内存0000:0000H~0000:000fH中的数据把代码段中定义的数据改写。这次是使用栈的方式中转了下。
关键点:程序首先定义了16个字节(8个字)数据;然后又定义了20个字节(10个字)的数据,供栈空间使用,空间是足够了,因为我们需要处理的数据是16个字节。
因为人工建的栈空间在程序代码段中,(ss)肯定是(cs),栈顶指针是多少?应该是16+20=36==24H,sp=0024H
循环中,单个字压入栈后,马上弹出栈送到目的内存中,一共循环8次。
代码如下:
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,cs
mov ss,ax
;建栈在代码段内存中
mov sp,24H ;初始化栈顶指针
mov ax,0
mov ds,ax
;将都是指向0000段地址的空间
mov bx,0
;初始化偏移地址
mov cx,8
;初始化计数器
s: push [bx]
;将00:00数据压栈
pop ss:[bx]
;将栈内数据弹栈到SS:00~0f
add bx,2
loop s
mov ax,4c00H
int 21H
codesg ends
end start
程序结果分析:
注意:pop ss:[bx]指令中,ss不能省略。
栈的溢出问题,栈结构空间要大于等于压栈的数据。
程序运行至mov ax,4c00H时,我们查看结果:
在cs:00 0f内存中,已经将原来的数据改写了。
-d cs:00 10
0B66:0000 68 10
A7 00 BB 13 68 05-16 00 9E 03 B1 13 68
05
h.....h.......h.
在00:00 0f内存中
0B66:0010
00
.
-d 00:00 10
0000:0000 68 10
A7 00 BB 13 68 05-16 00 9E 03 B1 13 68
05
h.....h.......h.
加载中,请稍候......