汇编语言(王爽第三版)检测点6.1
检测点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执行的代码(机器码)
代码如下:
1 assume cs:codesg 2 3 codesg segment 4 5 dw 0123H,0456H,0789h,0abch,0defh,0fedh,0cbah,0987h 6 7 start: mov ax,0 8 9 mov ds,ax ;ds指向了0000段内存。 10 11 12 13 mov bx,0 ;bx偏址变量置零 14 15 mov cx,8 ;要读取并改写8次,(cx)=8 16 17 18 19 s: mov ax,[bx] ;将ds:[bx]内存单元内容送入ax中 20 21 mov cs:[bx],ax ;将ax值回写到code段的前16个字节单元中 22 23 add bx,2 24 25 loop s 26 27 28 29 mov ax,4c00H 30 31 int 21H 32 33 codesg ends 34 35 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.