汇编网首页登录博客注册
13805662489的学习博客
博客首页博客互动【做检测题】论坛求助

我的博客

个人首页 |  我的文章 |  我的相册 |  我的好友 |  最新访客 |  文章收藏 |  论坛提问 |  友情链接 |  给我留言  
图片载入中
学习动态
最新评论
最新留言
好友圈
文章收藏
友情链接

[2017-05-19 17:16] 监测点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]                
        ___________                mov cs:[bx],ax 
        add bx,2
        loop s

        mov ax,4c00h
        int 21h
codesg ends
end start

// 先想清楚几个问题
        用哪里的内容改写程序中的数据
        先设置0:0~0:15单元中的段地址
        偏移地址都是从0开始的,所以都是用BX表示
        数据的长度都是2个字节,所以偏移地址每次都要移动两个字节,也就是bx要加上2
        数据从ds:[bx]来, 要放入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
start:        mov ax,____                mov ax,codesg
        mov ss,ax
        mov sp,____                mov sp=24h

        mov ax,0
        mov ds,ax
        mov bx,0
        mov cx,8
s:        push [bx]
        _________                pop cs:[bx]  
        add bx,2
        loop s

        mov ax,4200h
        int 21h
codesg ends
end start

// 这里首先的问题是设置栈顶,栈段为CS。栈顶24H。24H怎么来的呢
前面定义了8个dw数据,占用了16个内存单元,16进制表示为10H。后面又定义了10个dw的栈空间,
占用了20个内存单元,16进制表示为14H,10H+14H=24H
        然后设置ds,把内存0:0~0:15单元的数据入栈,偏移地址从0开始,用bx表示
        再出栈地址为代码段中的数据段,段地址为CS,偏移地址也是从0开始,用bx表示
        数据的长度,栈操作都为两字节,目标数据长度也为两字节,所以相符合,故每执行一次bx都要加上2
        因为不是逆序复制,因为前面做的逆序复制,所以这里一下子没反应过来,
这就是为什么push跟pop会用到一个循环
        push一个数据就马上pop出来
        被push的数据默认段地址为ds 
        被pop的数据段地址要明确给出,所以要写出pop的地址。
         栈操作用到的空间貌似就2个字节,因此我们的栈段比两字节长就可以了。
评论次数(0)  |  浏览次数(714)  |  类型(汇编作业) |  收藏此文  | 
 
 请输入验证码  (提示:点击验证码输入框,以获取验证码