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

 更新时间:2021年11月04日 15:32:38   作者:LyncDwight  
这篇文章主要为大家介绍了汇编语言功能实现数据复制的实例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步

问题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

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

相关文章

  • 汇编语言系列之汇编实现各种码制的转换(思路详解)

    汇编语言系列之汇编实现各种码制的转换(思路详解)

    本文列出了十六进制转二进制、十进制、ASCII码及大小写字母转换的代码,对汇编语言系列之实现各种码制的转换问题感兴趣的朋友跟随小编一起看看吧
    2021-11-11
  • 汇编语言Debug命令详解教程

    汇编语言Debug命令详解教程

    这篇文章主要为大家介绍了汇编语言Debug命令的教程,文中对Debug的命令进行了全面的讲解有需要的朋友可以借鉴参考共同学习下,希望能够有所帮助
    2021-11-11
  • 从Go汇编角度解读for循环的问题

    从Go汇编角度解读for循环的问题

    Go常用的遍历方式有两种:for和for-range。这篇文章主要介绍了从Go汇编角度解读for循环的两个疑点,本文通过实例代码给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-02-02
  • 汇编程序 查表求平方的实现

    汇编程序 查表求平方的实现

    这篇文章主要介绍了汇编程序 查表求平方的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-02-02
  • 汇编语言 and和or逻辑运算指令的实现

    汇编语言 and和or逻辑运算指令的实现

    这篇文章主要介绍了汇编语言 and,or逻辑运算指令的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-01-01
  • 汇编语言中的函数调用参数传递及全局与局部变量与“基址”

    汇编语言中的函数调用参数传递及全局与局部变量与“基址”

    这篇文章主要介绍了汇编眼中的函数调用参数传递以及全局与局部变量与“基址”,本文通过图文并茂的形式给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-02-02
  • ARM体系下的GCC内联汇编教程详解

    ARM体系下的GCC内联汇编教程详解

    在操作系统级的编程中,有时候,C语言并不能完全的使用硬件的功能,这时候就需要嵌入一些汇编代码来实现功能。这篇文章主要介绍了ARM体系下的GCC内联汇编,需要的朋友可以参考下
    2020-02-02
  • 汇编语言指令集之串处理指令讲解

    汇编语言指令集之串处理指令讲解

    这篇文章主要介绍了汇编语言指令集之串处理指令讲解,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2020-01-01
  • 汇编语言软件延时1s的实现方法

    汇编语言软件延时1s的实现方法

    这篇文章主要介绍了汇编语言软件延时1s的实现方法,本文给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-01-01
  • 利用DOSBox运行汇编的详细步骤

    利用DOSBox运行汇编的详细步骤

    本文分步骤给大家介绍了利用DOSBox运行汇编,起初是利用VS2017进行配置,但后面运行好像有些问题,就想到用DOSBox,本文分步骤给大家介绍的非常详细,感兴趣的朋友跟随小编一起看看吧
    2022-03-03

最新评论