您好,登錄后才能下訂單哦!
這篇文章主要講解了“匯編語(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í)例分析”吧!
分析
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
分析:
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
分析: 如何實(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
分析
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)注!
免責(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)容。