千家信息网

汇编语言功能实现数据复制实例分析

发表于:2024-11-14 作者:千家信息网编辑
千家信息网最后更新 2024年11月14日,这篇文章主要讲解了"汇编语言功能实现数据复制实例分析",文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习"汇编语言功能实现数据复制实例分析"吧!问题1:将内存
千家信息网最后更新 2024年11月14日汇编语言功能实现数据复制实例分析

这篇文章主要讲解了"汇编语言功能实现数据复制实例分析",文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习"汇编语言功能实现数据复制实例分析"吧!

问题1:将内存ffff:0~ffff:b单元中的数据复制到0:200~0:20b单元中

分析

1、0:200~0:20b单元如何表示

0020:0~0020:b可以等同于以上单元,而且单元的偏移地址是从0开始,和需要复制的单元相同

2、单元中的数据能直接进行复制转移吗

不可以,需要用寄存器进行中转

assume cs:codecode 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 endsend

问题2:将"mov ax,4c00h"之前的指令复制到内存0:200处

分析:

1、如何知道代码的起始地址

利用cs指向的就是代码的开始地址

2、如何知道代码的长度

可以使用(offset 标号)之间相减得出代码的长度

assume cs:codecode segmentstart:          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 bxlast:           loop s                 mov ax,4c00h                int 21hcode endsend

问题3:将程序中定义的数据逆序存放

分析: 如何实现逆序 利用栈的特性实现

assume cs:codecode 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 endsend start

改进版:以上程序中的内容没有分段存储,可改进

assume cs:code,ds:data,ss:stackdate segment        dw 0123h,0456h,0789h,0abch,0defh,0fedh,0cbah,0987hdate endsstack segment        dw 16 dup(0)  ;栈空间的使用stack ends code segmentstart:  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 21hcode 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 segmentstart:  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 21hcode ends;----------------------------------;做法二:只利用一个寄存器就可以实现 code segmentstart:  mov ax,data                mov ds,ax                mov si,0                 mov cx,8s:                 mov ax,ds:[si]                mov ds:[si+16],ax                add si,2                loop s           mov ax,4c00h                int 21hcode ends end start

感谢各位的阅读,以上就是"汇编语言功能实现数据复制实例分析"的内容了,经过本文的学习后,相信大家对汇编语言功能实现数据复制实例分析这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是,小编将为大家推送更多相关知识点的文章,欢迎关注!

0