汇编语言(王爽第三版)检测点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.

posted @ 2017-05-21 08:50  筑基2017  阅读(...)  评论(...编辑  收藏