溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶(hù)服務(wù)條款》

匯編語(yǔ)言功能實(shí)現(xiàn)數(shù)據(jù)復(fù)制實(shí)例分析

發(fā)布時(shí)間:2021-11-04 17:27:37 來(lái)源:億速云 閱讀:193 作者:iii 欄目:開(kāi)發(fā)技術(shù)

這篇文章主要講解了“匯編語(yǔ)言功能實(shí)現(xiàn)數(shù)據(jù)復(fù)制實(shí)例分析”,文中的講解內(nèi)容簡(jiǎn)單清晰,易于學(xué)習(xí)與理解,下面請(qǐng)大家跟著小編的思路慢慢深入,一起來(lái)研究和學(xué)習(xí)“匯編語(yǔ)言功能實(shí)現(xiàn)數(shù)據(jù)復(fù)制實(shí)例分析”吧!

問(wèn)題1:將內(nèi)存ffff:0~ffff:b單元中的數(shù)據(jù)復(fù)制到0:200~0:20b單元中

分析

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

0020:0~0020:b可以等同于以上單元,而且單元的偏移地址是從0開(kāi)始,和需要復(fù)制的單元相同

2、單元中的數(shù)據(jù)能直接進(jìn)行復(fù)制轉(zhuǎn)移嗎

不可以,需要用寄存器進(jìn)行中轉(zhuǎn)

assume cs:code
code segment
;做法一
;-----------------------------
	mov bx,0		;因?yàn)閿?shù)據(jù)來(lái)源和去處的偏移地址相同,用bx同意代替
	mov cx,12
 
 
s:	mov ax,offffh	;因?yàn)樾枰貜?fù)利用ax,所以需要循環(huán)設(shè)置
	mov ds,ax
	mov dl,ds:[bx]	;將數(shù)據(jù)復(fù)制到dx的低8位中
 
	mov ax,0020h
	mov ds,ax
	mov ds:[bx],dl	;將數(shù)據(jù)復(fù)制到指定的內(nèi)存單元中
 
	inc bx			;向下一個(gè)單元移動(dòng)
	loop s
 
;-----------------------------
 
;做法二,上一個(gè)做法需要重復(fù)設(shè)置ds,這里可改進(jìn)
;-----------------------------
	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

問(wèn)題2:將“mov ax,4c00h“之前的指令復(fù)制到內(nèi)存0:200處

分析:

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

利用cs指向的就是代碼的開(kāi)始地址

2、如何知道代碼的長(zhǎng)度

可以使用(offset 標(biāo)號(hào))之間相減得出代碼的長(zhǎng)度

assume cs:code
code segment
start:	        mov ax,cs
	 	mov ds,ax
		mov ax,0020h
		mov es,ax	;設(shè)置復(fù)制數(shù)據(jù)的來(lái)源和去處
 
		mov bx,0
		mov cx,offset last-offset start	  ;設(shè)置代碼的長(zhǎng)度
 
s:		mov al,ds:[bx]
		mov es:[bx],al	;實(shí)現(xiàn)數(shù)據(jù)的轉(zhuǎn)移
		inc bx
last:           loop s
 
		mov ax,4c00h
		int 21h
code ends
end

問(wèn)題3:將程序中定義的數(shù)據(jù)逆序存放

分析: 如何實(shí)現(xiàn)逆序 利用棧的特性實(shí)現(xiàn)

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	;??臻g是從后往前添加,棧頂指向30h
 
		mov bx,0
		mov cx,8
 
s:		push cs:[bx]
		add bx,2
		loop s		;將數(shù)據(jù)段中的0~15單元中的數(shù)據(jù)壓入棧中
 
		mov bx,0
		mov cx,8
 
s0:		pop cs:[bx]
		add bx,2
		loop s0		;依次出棧8個(gè)字型數(shù)據(jù)
 
		mov ax,4c00h
		int 21h
 
code ends
end start

改進(jìn)版:以上程序中的內(nèi)容沒(méi)有分段存儲(chǔ),可改進(jìn)

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	;棧開(kāi)始的地址已經(jīng)不包括data段的內(nèi)容,則為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

問(wèn)題4:將字符串”welcome to masm”復(fù)制到它后面的數(shù)據(jù)區(qū)中

分析

1、要復(fù)制到數(shù)據(jù)在哪里

數(shù)據(jù)的起始地址在data:0

2、要復(fù)制到哪里去

復(fù)制的數(shù)據(jù)長(zhǎng)度是16個(gè)字節(jié),后面的數(shù)據(jù)區(qū)的偏移地址就是16

3、一共復(fù)制了幾次

因?yàn)槭褂玫氖?6位寄存器,一次可以傳輸兩個(gè)字節(jié),所以只需要執(zhí)行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	;設(shè)置數(shù)據(jù)來(lái)源的起始位置
		mov di,16	;設(shè)置數(shù)據(jù)去處的起始位置
 
		mov cx,8	;用寄存器進(jìn)行復(fù)制,只需要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
;----------------------------------
;做法二:只利用一個(gè)寄存器就可以實(shí)現(xiàn) 
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

感謝各位的閱讀,以上就是“匯編語(yǔ)言功能實(shí)現(xiàn)數(shù)據(jù)復(fù)制實(shí)例分析”的內(nèi)容了,經(jīng)過(guò)本文的學(xué)習(xí)后,相信大家對(duì)匯編語(yǔ)言功能實(shí)現(xiàn)數(shù)據(jù)復(fù)制實(shí)例分析這一問(wèn)題有了更深刻的體會(huì),具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是億速云,小編將為大家推送更多相關(guān)知識(shí)點(diǎn)的文章,歡迎關(guān)注!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI