汇编语言功能实现数据复制实例详解
发布时间:2021-11-08 03:46:47 所属栏目:教程 来源:互联网
导读:目录 问题1:将内存ffff:0~ffff:b单元中的数据复制到0:200~0:20b单元中问题2:将mov ax,4c00h之前的指令复制到内存0:200处问题3:将程序中定义的数据逆序存放问题4:将字符串welcome to masm复制到它后面的数据区中 问题1:将内存ffff:0~ffff:b单元中的数据复
目录 问题1:将内存ffff:0~ffff:b单元中的数据复制到0:200~0:20b单元中问题2:将“mov ax,4c00h“之前的指令复制到内存0:200处问题3:将程序中定义的数据逆序存放问题4:将字符串”welcome to masm”复制到它后面的数据区中 问题1:将内存ffff:0~ffff:b单元中的数据复制到0:200~0:20b单元中 分析 1、0:200~0:20b单元如何表示 0020:0~0020:b可以等同于以上单元,而且单元的偏移地址是从0开始,和需要复制的单元相同 2、单元中的数据能直接进行复制转移吗 不可以,需要用寄存器进行中转 assume cs:code code segment ;做法一 ;----------------------------- mov bx,0 ;因为数据来源和去处的偏移地址相同,用bx同意代替 mov cx,12 s: mov ax,offffh ;因为需要重复利用ax,所以需要循环设置 mov ds,ax mov dl,ds:[bx] ;将数据复制到dx的低8位中 mov ax,0020h mov ds,ax mov ds:[bx],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:[bx] mov es:[bx],dl inc bx loop s ;----------------------------- mov ax,4c00h int 21h code ends end 问题2:将“mov ax,4c00h“之前的指令复制到内存0:200处 分析: 1、如何知道代码的起始地址 利用cs指向的就是代码的开始地址 2、如何知道代码的长度 可以使用(offset 标号)之间相减得出代码的长度 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:[bx] mov es:[bx],al ;实现数据的转移 inc bx last: loop s mov ax,4c00h int 21h code ends end 问题3:将程序中定义的数据逆序存放 分析: 如何实现逆序 利用栈的特性实现 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:[bx] add bx,2 loop s ;将数据段中的0~15单元中的数据压入栈中 mov bx,0 mov cx,8 s0: pop cs:[bx] add bx,2 loop s0 ;依次出栈8个字型数据 mov ax,4c00h int 21h code ends end start 改进版:以上程序中的内容没有分段存储,可改进 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:[bx] add bx,2 loop s mov bx,0 mov cx,8 s0: pop ds:[bx] add bx,2 loop s0 mov ax,4c00h int 21h code ends end start 问题4:将字符串”welcome to masm”复制到它后面的数据区中 分析 1、要复制到数据在哪里 数据的起始地址在data:0 2、要复制到哪里去 复制的数据长度是16个字节,后面的数据区的偏移地址就是16 3、一共复制了几次 因为使用的是16位寄存器,一次可以传输两个字节,所以只需要执行8次 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:[si] mov ds:[di],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:[si] mov ds:[si+16],ax add si,2 loop s mov ax,4c00h int 21h code ends end start (编辑:好传媒网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |