铁锤锤锤锤 發表於 2021-11-4 15:32:38

汇编语言功能实现数据复制实例详解

<div id="navCategory"><h5 class="catalogue">目录</h5><ul class="first_class_ul"><li>问题1:将内存ffff:0~ffff:b单元中的数据复制到0:200~0:20b单元中</li><li>问题2:将“mov ax,4c00h“之前的指令复制到内存0:200处</li><li>问题3:将程序中定义的数据逆序存放</li><li>问题4:将字符串”welcome to masm”复制到它后面的数据区中</li></ul></div><p class="maodian"></p><h2>问题1:将内存ffff:0~ffff:b单元中的数据复制到0:200~0:20b单元中</h2>
<p>分析</p>
<p>1、0:200~0:20b单元如何表示</p>
<p>0020:0~0020:b可以等同于以上单元,而且单元的偏移地址是从0开始,和需要复制的单元相同</p>
<p>2、单元中的数据能直接进行复制转移吗</p>
<p>不可以,需要用寄存器进行中转</p>
<div class="jb51code">
<pre class="brush:plain;">
assume cs:code
code segment
;做法一
;-----------------------------
        mov bx,0                ;因为数据来源和去处的偏移地址相同,用bx同意代替
        mov cx,12


s:        mov ax,offffh        ;因为需要重复利用ax,所以需要循环设置
        mov ds,ax
        mov dl,ds:        ;将数据复制到dx的低8位中

        mov ax,0020h
        mov ds,ax
        mov ds:,dl        ;将数据复制到指定的内存单元中

        inc bx                        ;向下一个单元移动
        loop s

;-----------------------------

;做法二,上一个做法需要重复设置ds,这里可改进
;-----------------------------
        mov ax,0ffffh
        mov ds,ax
        mov ax 0020h
        mov es,ax
        mov bx,0
        mov cx,12
s:        mov dl,ds:
        mov es:,dl
        inc bx
        loop s

;-----------------------------

        mov ax,4c00h
        int 21h
code ends
end</pre>
</div>
<p class="maodian"></p><h2>问题2:将“mov ax,4c00h“之前的指令复制到内存0:200处</h2>
<p>分析:</p>
<p>1、如何知道代码的起始地址</p>
<p>利用cs指向的就是代码的开始地址</p>
<p>2、如何知道代码的长度</p>
<p>可以使用(offset 标号)之间相减得出代码的长度</p>
<div class="jb51code">
<pre class="brush:plain;">
assume cs:code
code segment
start:                mov ax,cs
               mov ds,ax
                mov ax,0020h
                mov es,ax        ;设置复制数据的来源和去处

                mov bx,0
                mov cx,offset last-offset start          ;设置代码的长度

s:                mov al,ds:
                mov es:,al        ;实现数据的转移
                inc bx
last:         loop s

                mov ax,4c00h
                int 21h
code ends
end</pre>
</div>
<p class="maodian"></p><h2>问题3:将程序中定义的数据逆序存放</h2>
<p>分析: 如何实现逆序 利用栈的特性实现</p>
<div class="jb51code">
<pre class="brush:plain;">
assume cs:code
code segment
        dw 0123h,0456h,0789h,0abch,0defh,0fedh,0cbah,0987h
        dw 16 dup(0)        ;栈空间的使用

start:         mov ax,cs
                mov ss,ax
                mov sp,30h        ;栈空间是从后往前添加,栈顶指向30h

                mov bx,0
                mov cx,8

s:                push cs:
                add bx,2
                loop s                ;将数据段中的0~15单元中的数据压入栈中

                mov bx,0
                mov cx,8

s0:                pop cs:
                add bx,2
                loop s0                ;依次出栈8个字型数据

                mov ax,4c00h
                int 21h

code ends
end start</pre>
</div>
<p>改进版:以上程序中的内容没有分段存储,可改进</p>
<div class="jb51code">
<pre class="brush:plain;">
assume cs:code,ds:data,ss:stack
date segment
        dw 0123h,0456h,0789h,0abch,0defh,0fedh,0cbah,0987h
date ends
stack segment
        dw 16 dup(0)        ;栈空间的使用
stack ends
code segment
start:        mov ax,stack
                mov ss,ax
                mov sp,20h        ;栈开始的地址已经不包括data段的内容,则为20h
                mov ax,data
                mov ds,ax
                mov bx,0
                mov cx,8
s:                push ds:
                add bx,2
                loop s
                mov bx,0
                mov cx,8
s0:                pop ds:
                add bx,2
                loop s0
                mov ax,4c00h
                int 21h
code ends
end start</pre>
</div>
<p class="maodian"></p><h2>问题4:将字符串”welcome to masm”复制到它后面的数据区中</h2>
<p>分析</p>
<p>1、要复制到数据在哪里</p>
<p>数据的起始地址在data:0</p>
<p>2、要复制到哪里去</p>
<p>复制的数据长度是16个字节,后面的数据区的偏移地址就是16</p>
<p>3、一共复制了几次</p>
<p>因为使用的是16位寄存器,一次可以传输两个字节,所以只需要执行8次</p>
<div class="jb51code">
<pre class="brush:plain;">
assume cs:code,ds:data
data segment
        db 'welcome to masm!'
        db 16 dup(0)
data ends
;----------------------------------
;做法一
code segment
start:        mov ax,data
                mov ds,ax
                mov si,0        ;设置数据来源的起始位置
                mov di,16        ;设置数据去处的起始位置

                mov cx,8        ;用寄存器进行复制,只需要8次
s:                mov ax,ds:
                mov ds:,ax
                add si,2
                add di,2
                loop s
                mov ax,4c00h
                int 21h
code ends
;----------------------------------
;做法二:只利用一个寄存器就可以实现
code segment
start:        mov ax,data
                mov ds,ax
                mov si,0

                mov cx,8
s:                 mov ax,ds:
                mov ds:,ax
                add si,2
                loop s
                mov ax,4c00h
                int 21h
code ends
end start</pre>
</div>
<p>以上就是汇编语言功能实现数据复制实例详解的详细内容,更多关于汇编语言实现数据复制的资料请关注琼殿技术社区其它相关文章!</p>
                           
                            <div class="art_xg">
                              <b>您可能感兴趣的文章:</b><ul><li>汇编基础教程段的定义应用详解</li><li>springboot启动类如何剔除扫描某个包</li><li>汇编语言功能字符串大小写转换实现实例详解</li><li>汇编语言超浓缩教程</li><li>王爽 汇编语言学习笔记(详细)</li><li>汇编基础程序编写教程示例</li></ul>
                            </div>

                        </div>
                        <!--endmain-->
頁: [1]
查看完整版本: 汇编语言功能实现数据复制实例详解