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

目录
  • 问题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

以上就是汇编语言功能实现数据复制实例详解的详细内容,更多关于汇编语言实现数据复制的资料请关注我们其它相关文章!

(0)

相关推荐

  • 汇编 函数调用的实现

    1. 从代码的顺序执行说起 每一个程序员脑子里应该都有这么一种印象:"程序是顺序执行的".这个观点其实和我们开篇所讲的cpu的流水线执行过程直接相关. 让我们再回忆一下脑海中关于函数调用的概念,也许会是这个样子: 这里的"控制流转移"又是如何发生的呢?在解释这个之前,也许我们需要科普一点有关于汇编的知识. 2. 函数调用中的一些细节说明 2.1 函数调用中的关键寄存器 2.1.1 程序计数器PC 程序计数器是一个计算机组成原理中讲过的概念,下面给出一个百度百科中的简

  • 汇编语言指令集之条件转移指令实现

    条件转移指令较多,容易混淆,在此记录一下便于日后使用 1. 根据单个条件标志的设置情况转移 指令 英文 含义 格式 测试条件 JZ/JE jump if zero/equal 结果为零/相等则转移 JZ/JE OPR ZF=1 JNZ/JNE jump if not zero/equal 结果不为零/不相等则转移 JNZ/JNE OPR ZF=0 JS jump if sign 结果为负则转移 JS OPR SF=1 JNS jump if not sign 结果为正则转移 JNS OPR SF

  • 汇编语言入门汇编指令及寄存器详解教程

    目录 前言 什么是汇编语言 汇编语言产生的原因 汇编与二进制的关系 寄存器 寄存器作用 存取速度比较 寄存器分类 常用寄存器用途 寄存器EAX.AX.AH.AL的关系 汇编语言指令 数据传送指令 算术运算指令 逻辑运算指令 循环控制指令 转移指令 linux 和 windows 下汇编的区别 总结 前言 我们大都是被高级语言惯坏了的一代,源源不断的新特性正在逐步添加到各类高级语言之中,汇编作为最接近机器指令的低级语言,已经很少被直接拿来写程序了,不过我还真的遇到了一个,那是之前的一个同事,因为在

  • 汇编实现的memcpy和memset的方法

    天天山珍海味的吃,也会烦.偶尔来点花生,毛豆小酌一点,也别有一番风味. 天天java, golang, c++, 咱们今天来点汇编调剂一下,如何? 通过这篇文章,您可以了解过: CPU寄存器的一些知识; 函数调用的过程; 汇编的一些知识; glibc 中 memcpy和memset的使用; 汇编中memcpy和memset是如何实现的; 闲话不多说,今天来看看汇编中如何实现memcpy和memset(脑子里快回忆下你最后一次接触汇编是什么时候......) 函数是如何被调用的 栈的简单介绍 栈对

  • 汇编语言功能用循环累加实现乘法

    目录 问题1:编程计算2的2次方,结果存在ax中 分析:用2+2实现 问题2:编程实现2的12次方 分析:用loop实现 问题3:编程实现123*236,结果存在ax中 分析:用236相加123次的计算次数比较少,节约计算资源 问题4:计算ffff:0006单元中的数乘以3,结果存储在dx中 1.判断数据是否能够存储 2.判断数据相加是否能够位数相同 问题5:计算ffff:0~ffff:b单元中的数据的和,结果存储在dx中 1.运算的结果是否超出寄存器的范围 2.能否直接相加dx中的数据 问题6

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

    目录 问题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可以等同于以上单元,而且单元的偏移

  • Vuejs第九篇之组件作用域及props数据传递实例详解

    本篇资料来于官方文档: http://cn.vuejs.org/guide/components.html#Props 本教程是小编结合官方文档整理的一套更加细致,代码更多更全的教程,特别适合新手阅读. props数据传递 ①组件实例的作用域: 是孤立的,简单的来说,组件和组件之间,即使有同名属性,值也不共享. <div id="app"> <add></add> <del></del> </div> <sc

  • C#中WPF ListView绑定数据的实例详解

    C#中WPF ListView绑定数据的实例详解 WPF中ListView用来显示数据十分方便, 我们可以将它分成几个列,每一个列用来显示一条数据,但是又是在一方之中. 那么怎样实现这样的效果的呢,这就要用绑定了. 我们先来看一看他的xmal代码 <ListView Name="receiveList" Grid.Row="0"> <ListView.View> <GridView> <GridView.Columns>

  • 微信小程序 本地数据存储实例详解

    微信小程序 本地数据存储实例详解 前言 如果您在看此文章之前有过其他程序的开发经验,那一定会知道一般例如安卓或者苹果的原生APP都提供了本地的存储功能,甚至可以使用sqlite数据库来做存储.可是微信的小程序框架基于微信本身,其实际运行环境只是在浏览器里面,所以不会提供那么丰富的数据存储实力.但html5开始已经可以在浏览器里面存储数据,好在微信的小程序给这个功能封装好了,这样我们可以使用数据存储. 每个微信小程序都可以有自己的本地缓存,可以通过 wx.setStorage(wx.setStor

  • Python 处理数据的实例详解

    Python 处理数据的实例详解 最近用python(3.2的版本)写了根据特定规则,处理数据的一个小程序,用到了一些python常用的基础知识,在此总结一下: 1,python读文件 2,python写文件 3,python的流程控制 4,python的for循环 5,python的集合,或字符串里判断是否存在某个元素 6,python的逻辑或,逻辑与 7,python的正则过滤 8,python的字符串忽略空格,和以某个字符串开头和按某个字符拆分成list python的打开文件的模式: 关

  • Javascript复制实例详解

    在做项目时有一个需求,是需要复制内容到剪切板,因为有众多浏览器,所以要兼容性很重要. 1.最简单的copy,只能在IE下使用 使用clipboardData方法 <script type="text/javascript"> function copy(){ window.clipboardData.setData("text",document.getElementById("name").value); alert("T

  • C语言文件复制实例详解

    C语言文件复制实例详解 文件复制,在Linux中,将生成的read.o 重新文件拷贝一份复制到ReadCopy.o中,并且更改ReadCopy.o文件的操作权限.使其能够正常运行. 实例代码: #include <stdio.h> int main(){ FILE *r_file = fopen ("read.o","rb"); FILE *w_file = fopen ("ReadCopy.o","w"); ch

  • java 分割csv数据的实例详解

    java 分割csv数据的实例详解 实际需要解析的csv中很多都是从excel中转过来的,数据中本身包含了逗号的数据导致split的过程中发现数据对不上,因此,基于这种特性,重新写了一个csv数据的分割方法: 实现代码: public static String[] split(String line) { List<String> list = new ArrayList<>(); int start = 0; int end = -1; while(true) { start

  • Java对象深复制与浅复制实例详解

     Java对象深复制与浅复制实例详解 我们在遇到一些业务场景的时候经常需要对对象进行复制,对于对象的复制一般有两种方式,深复制和浅复制 浅复制:对象的复制仅是对象本身,对象引用的其它对方并不会复制. 深复制:对象的复制包含对象引用的对象. Java所有对象的基类提供了clone方法,但是这个方法是protected native修饰,因此只暴露给之类去重写,外部是无法直接调用的. 我们现在来测试两种复制,首选是浅复制,浅复制要实现Cloneable接口. // 课程对象 class Class

  • 对pandas的算术运算和数据对齐实例详解

    pandas可以对不同索引的对象进行算术运算,如果存在不同的索引对,结果的索引就是该索引对的并集. 一.算术运算 a.series的加法运算 s1 = Series([1,2,3],index=["a","b","c"]) s2 = Series([4,5,6],index=["a","c","e"]) print(s1+s2) ''' a 5.0 b NaN c 8.0 e NaN '

随机推荐