这篇文章主要讲解了“汇编语言功能实现数据复制实例分析”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“汇编语言功能实现数据复制实例分析”吧!
分析
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
分析:
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
分析: 如何实现逆序 利用栈的特性实现
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
分析
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
感谢各位的阅读,以上就是“汇编语言功能实现数据复制实例分析”的内容了,经过本文的学习后,相信大家对汇编语言功能实现数据复制实例分析这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是亿速云,小编将为大家推送更多相关知识点的文章,欢迎关注!
亿速云「云服务器」,即开即用、新一代英特尔至强铂金CPU、三副本存储NVMe SSD云盘,价格低至29元/月。点击查看>>
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。