加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

汇编语言(王爽第三版)检测点6.1

(2017-04-22 15:37:35)
标签:

汇编

王爽

it

教育

分类: 汇编语言(王爽第三版)检测点

检测点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==24Hsp=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] ;将栈内数据弹栈到SS00~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.

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有