組合語言之「複製字串」

2022-03-15 18:17:18 字數 1924 閱讀 2437

主要分為兩個思路,一種是寫迴圈,可細分為間接定址和直接定址;另一種是用指令,也是比較簡單方便的做法

我認為有必要先記錄一下字串的定義方式

分為源字串和目的字串

源字串:srcmsg db 'fuzhou university',0

目的字串:dstmsg db sizeof srcmsg dup(?) \n db 0

在定義字串時,末尾最好要加上結束符『0』,但是有時因為dup(?)表示預設全是0,可能就會沒有加,最好養成良好習慣。

**釋義:

lea 表示取到msg1的首位址,存入esi,msg2的首位址存入edi(存入的時特定的暫存器,是有實際意義的,後面會說明)

然後用ecx存放msg1的長度,也就是存放複製字元的長度

cld(clear direction flag)則是清方向標誌位,也就是使df值為0,在執行串操作時,使位址按遞增的方式變化,這樣便於調整相關段的的當前指標。這條指令與std(set direction flag)的執行結果相反,即置df的值為1

rep movsb 是重複移動複製的意思

此時msg2已經完全複製得到了msg1的字元,由於writestring的輸出需要放在edx暫存器中,所以這裡也是mov到特定暫存器edx。

以下為參考資料,可以有助於理解cld \n rep movsb \n是如何替代迴圈的;from:

————————————— ——————— 分割線 ———————— ——————————————

先說說movsb(move string byte):即字串傳送指令,這條指令按位元組傳送資料。通過si和di這兩個暫存器控制字串的源位址和目標位址,比如ds:si這段位址的n個位元組複製到es:di指向的位址,複製後ds:si的內容保持不變。

而rep(repeat)指令就是「重複」的意思,術語叫做「重複字首指令」,因為既然是傳遞字串,則不可能乙個字(節)乙個字(節)地傳送,所以需要有乙個暫存器來控制串長度。這個暫存器就是cx,指令每次執行前都會判斷cx的值是否為0(為0結束重複,不為0,cx的值減1),以此來設定重複執行的次數。因此設定好cx的值之後就可以用rep movsb了。

cld(clear direction flag)則是清方向標誌位,也就是使df的值為0,在執行串操作時,使位址按遞增的方式變化,這樣便於調整相關段的的當前指標。這條指令與std(set direction flag)的執行結果相反,即置df的值為1。

;example:把當前資料段中偏移1000h開始

;的100個位元組資料傳送到偏移2000h開始的

;單元中

cld ;指標增值

push ds ;當前資料段,因此壓入棧中儲存

pop es ;使es=ds

mov si,1000h ;源串指標初值

mov di,2000h ;目的串指標初值

mov cx,100 ;迴圈次數

next:

lodsb ;取乙個位元組

stosb ;存乙個位元組

loop next ;迴圈cx次

;以下程式片段與上面的等價:

;或者用更簡單的寫法:

cld……

mov cx,100

rep movsb

字串之複製函式

字串之複製函式 strcpy函式 函式原型 char strcpy char dest,const char src memcpy函式 原型 extern void memcpy void dest,void src,unsigned int count 用法 include 功能 由src所指記憶...

計算字串長度 組合語言

設有一字串存放在以 buf 為首址的資料區中,其最後一字元 作為結束標誌,計算該字串的長度並輸出 datas segment buf db 20,20 dup datas ends stacks segment stacks ends codes segment assume cs codes,ds...

組合語言巧妙排序字串

用組合語言實現任意輸入字串排序,我主要是採用先分組,然後分別排序,在把兩個組合起來排序的使用演算法。在我的輸出結果頁面中,總共會有6行,第一行表示的是你所輸入的我們需要排序的字串,第二行表示的是將字串分為兩組其中的第一組,第三行表示的是將字串分為兩組其中的第二組,第四行表示的是對分成的第一組排序得到...