匯編語言-016(SCASB 、STOSB 、LODSD 、數組中的取值、二維數組操作、冒泡排序和二分查找、CMPSW )

1: SCASB : (字節)將AL的值與EDI尋址的一個字比較。進行在一個字符串檢索特定的字符

.386
.model flat,stdcall.stack 4096
ExitProcess PROTO,dwExitCode:DWORD.data 
alpha BYTE "ABCDEFGH",0.code
main PROCmov edi,OFFSET alpha  ;EDI指向字符串mov al,'F'            ;檢索字符Fmov ecx,LENGTHOF alpha ;設置檢索計數器cld                   ;方向為正向repne scasb            ;不相等則重復jnz  quit               ;若未發現字符則退出dec edi       ;發現字符,EDI減1,因為執行scasb后,edi增加1了quit:INVOKE ExitProcess,0 
main ENDP
END main

2:STOSB : (字節)將AL的值復制到EDI尋址的位置上,可以加上rep重復操作

.386
.model flat,stdcall.stack 4096
ExitProcess PROTO,dwExitCode:DWORD.data
Count =100
string1 BYTE Count DUP(?).code
main PROCmov al,0FFh   ;要保存的數值mov edi,OFFSET string1 ;EDI指向目標字符串mov ecx,Countcldrep stosb  ;用AL的內容實現填充INVOKE ExitProcess,0
main ENDP
END main

3:LODSD : (雙字)交一個雙字數組中的每個元素都乘以同一個常數

.386
.model flat,stdcall.stack 4096
ExitProcess PROTO,dwExitCode:DWORD.data
array DWORD 1,2,3,4,5,6,7,8,9,10
multiplier DWORD 10  ;將一個32位整數數組中的每個元素都乘以一個常數.code
main PROCcld mov esi,OFFSET array  ;源數組索引mov edi,esi   ;目標數組索引mov ecx,LENGTHOF array  ;循環計數器
L1:lodsd   ;[ESI]加載到EAXmul multiplier  ;與常數相乘stosd    ;將EAX保存到[EDI]loop L1  INVOKE ExitProcess,0
main ENDP
END main

4:數組中的取值,基址——變址操作數,將兩個寄存器(稱為基址和變址)相加,生成一個偏移地址

.386
.model flat,stdcall.stack 4096
ExitProcess PROTO,dwExitCode:DWORD.data
array WORD 1000h,2000h,3000h.code
main PROCmov ebx,OFFSET arraymov esi,2mov ax,[ebx+esi]  ;AX=2000hmov edi,OFFSET arraymov ecx,4mov ax,[edi+ecx]   ;AX = 3000hmov ebp,OFFSET arraymov esi,0mov ax,[ebp+esi]INVOKE ExitProcess,0
main ENDP
END main

5:二維數組中取值

.386
.model flat,stdcall.stack 4096
ExitProcess PROTO,dwExitCode:DWORD.data
tableB BYTE 10h,20h,30h,40h,50h
RowSize = ($ - tableB)BYTE 60h,70h,80h,90h,0A0hBYTE 0B0h,0C0h,0D0h,0E0h,0F0h.code
main PROCrow_index = 1column_index = 2mov ebx,OFFSET tableB ;表的偏移量add ebx,RowSize * row_index  ;行的偏移量mov esi,column_indexmov al,[ebx+esi]     ;AL = 80hINVOKE ExitProcess,0
main ENDP
END main

6:計算二維數組中某一行的之和

.386
.model flat,stdcall.stack 4096
ExitProcess PROTO,dwExitCode:DWORD.data
tableB BYTE 10h,20h,30h,40h,50h
RowSize = ($ - tableB)BYTE 60h,70h,80h,90h,0A0hBYTE 0B0h,0C0h,0D0h,0E0h,0F0h.code
main PROCrow_index = 1column_index = 2mov ebx,OFFSET tableB ;表的偏移量add ebx,RowSize * row_index  ;行的偏移量mov esi,column_indexmov al,[ebx+esi]     ;AL = 80hINVOKE ExitProcess,0
main ENDP;計算字節矩陣中一行的和數
;接收:EBX=表偏移量,EAX=行索引
;ECX=按字節計的行大小
;返回:EAX為和數
calc_row_sum PROC USES ebx ecx edx esimul ecx   ;行索引 * 行大小add ebx,eax ;行偏移量mov eax,0   ;累加器mov esi,0   ;列索引
L1:movzx edx,BYTE PTR[ebx + esi] ;取一個字節add eax,edx          ;與累加器相加inc esi            ;行中下一個字節loop L1ret
calc_row_sum ENDP
END main

7:二維數組中使用比例因子尋址取值

.386
.model flat,stdcall.stack 4096
ExitProcess PROTO,dwExitCode:DWORD.data
tableW WORD 10h,20h,30h,40h,50h
RowSizeW = ($ - tableW)WORD 60h,70h,80h,90h,0A0hWORD 0B0h,0C0h,0D0h,0E0h,0F0h.code
main PROCrow_index = 1column_index = 2mov ebx,OFFSET tableW   ;表偏移量add ebx,RowSizeW * row_index ;行偏移量mov esi,column_indexmov ax,[ebx + esi*TYPE tableW]  ;AX = 0080hINVOKE ExitProcess,0
main ENDPEND main

8:基址——變址——偏移量操作數,用一個偏移量、一個基址寄存器、一個變址寄存器和一個可選的比例因子生成有效地址

.386
.model flat,stdcall.stack 4096
ExitProcess PROTO,dwExitCode:DWORD.data
tableD DWORD 10h,20h,30h,40h,50h
RowSizeD = ($ - tableD)DWORD 60h,70h,80h,90h,0A0hDWORD 0B0h,0C0h,0D0h,0E0h,0F0h.code
main PROCrow_index = 1column_index = 2mov ebx,RowSizeD * row_index   ;行索引mov esi,column_index           ;列索引mov eax,tableD[ebx + esi*TYPE tableD]  ;AX = 00000080hINVOKE ExitProcess,0
main ENDPEND main

9:64位基址——變址——偏移量操作數做法

BinarySearch.asm

include BinarySearch.inc.codeBinarySearch PROC USES ebx edx esi edi,pArray:PTR DWORD, ;數組指針Count:DWORD,      ;數組大小searchVal:DWORD   ;給定查找數值LOCAL first:DWORD,;first的位置last:DWORD, ;last的位置mid:DWORD   ;中點mov first,0        ;first = 0mov eax,Count      ;last = (Count - 1)dec eaxmov last,eaxmov edi,searchVal  ;EDI = searchValmov ebx,pArray     ;EBX 為 數組指針
L1:;當first<=last時mov eax,firstcmp eax,lastjg L5              ;退出查找;mid = (last+first)/2mov eax,lastadd eax,firstshr eax,1mov mid,eax;EDX = values[mid]mov esi,midshl esi,2            ;將mid 值乘4mov edx,[ebx+esi]    ;EDX = values[mid];若EDX < searchVal(EDI)cmp edx,edijge L2;first = mid +1mov eax,midinc eaxmov first,eaxjmp L4;否則,若EDX>searchVal(EDI)
L2:cmp edx,edijle L3    ;可選項;last=mid - 1mov eax,middec eaxmov last,eaxjmp L4;否則返回mid
L3:mov eax,mid   ;發現數值jmp L9        ;返回mid
L4: jmp L1         ;繼續循環
L5:mov eax,-1     ;查找失敗
L9:retBinarySearch ENDPEND 

BinarySearch.inc

.386
.model flat,stdcall.stack 4096;冒泡排序/對半查找程序中使用的過程原型;32位有符號整數數組中查找一個數
BinarySearch PROTO,pArray:PTR DWORD,     ;指向數組Count:DWORD,          ;數組大小searchVal:DWORD       ;查找數值;32位有符號隨機整數填充數組
FillArray PROTO,pArray:PTR DWORD,       ;指向數組Count:DWORD,            ;元素個數LowerRange:SDWORD,      ;隨機數的下限UpperRange:SDWORD       ;隨機數的上限;32位有符號整數數組定到標準輸出
PrintArray PROTO,pArray:PTR DWORD,Count:DWORD,;將數組按升序排列
BubbleSort PROTO,pArray:PTR DWORD,Count:DWORD

BinarySearchTest.asm

include Irvine32.inc
include BinarySearch.incLOWVAL = -5000       ;最小值
HIGHVAL = +5000      ;最大值
ARRAY_SIZE = 50      ;數組大小.data
array DWORD ARRAY_SIZE DUP(?).code
main PROCcall Randomize;用有符號隨機整數填充數組INVOKE FillArray,ADDR array,ARRAY_SIZE,LOWVAL,HIGHVAL;顯示數組INVOKE PrintArray,ADDR array,ARRAY_SIZEcall WaitMsg;執行冒泡排序并再次顯示數組INVOKE BubbleSort ,ADDR array,ARRAY_SIZEINVOKE PrintArray,ADDR array,ARRAY_SIZE;實現對半查找call AskForSearchVal   ;用EAX返回INVOKE BinarySearch,ADDR array,ARRAY_SIZE,eaxcall ShowResultsexit
main ENDP;請求用戶輸入一個有符號整數
;接收:無
;返回:EAX = 用戶輸入的數值
AskForSearchVal PROC
.data
prompt BYTE "Enter a signed decimal integer "BYTE "in the range of -5000 to +5000 "BYTE "to find in the array: ",0
.codecall Crlfmov edx,OFFSET promptcall WriteStringcall ReadIntret
AskForSearchVal ENDP;顯示對半查找的結果值
;接收:EAX = 被顯示數的位置
;返回:無
ShowResults PROC
.data
msg1 BYTE "The value was not found,",0
msg2 BYTE "The value was found at position ",0
.code
.IF eax == -1mov  edx,OFFSET msg1call WriteString
.ELSEmov edx,OFFSET msg2call WriteStringcall WriteDec
.ENDIFcall Crlfcall Crlfret
ShowResults ENDP
END main

BubbleSort.asm

include BinarySearch.inc.code;使用冒泡算法,將一個32位有符號整數數組升序進行排列
;接收:數組指針,數組大小
;返回:無
BubbleSort PROC USES eax ecx esi,pArray:PTR DWORD,        ;數組指針Count:DWORD              ;數組大小mov ecx,Countdec ecx        ;計數值減1
L1:push ecx       ;保存外循環計數值mov esi,pArray; 指向第一個數值
L2:mov eax,[esi]   ;取數組元素值cmp [esi+4],eax ;比較兩個數值jg L3           ;如果[ESI]<=[ESI+4],不交換xchg eax,[esi+4];交換兩數mov [esi],eax
L3:add esi,4   ;兩個指針都向前移動一個元素loop L2     ;內循環pop ecx     ;恢復外循環計數值loop L1     ;若計數值不等于0,則繼續外循環
L4:ret
BubbleSort ENDP
END 

FillArray.asm

include Irvine32.inc.code
;用LowerRange到(UpperRange-1之間的32位隨機有符號整數序列填充數組)
;返回:無
FillArray PROC USES eax edi ecx edx,pArray:PTR DWORD,      ;數組指針Count:DWORD,          ;元素個數LowerRange:SDWORD,     ;范圍下限UpperRange:SDWORD     ;范圍上限mov edi,pArray    ;EDI為數組指針mov ecx,Count     ;循環計數器mov edx,UpperRangesub edx,LowerRange   ;EDX = 絕對范圍0..ncld   ;方向標志位清零
L1:mov eax,edx   ;偏移處理結果call RandomRangeadd eax,LowerRange  ;偏移處理結果stosd    ;將EAX 保存到[edi]loop L1ret
FillArray ENDP
END 

PrintArray.asm

include Irvine32.inc.code
;32位有符號十進制整數數組寫到標準輸出,數值用逗號隔開
;接收:數組指針,數組大小
;返回:無
PrintArray PROC USES eax ecx edx esi,pArray:PTR DWORD,  Count:DWORD
.data
comma BYTE ", ",0
.codemov esi,pArraymov ecx,Countcld
L1:lodsd       ;加載[ESI]到EAXcall WriteInt  ;發送到輸出mov edx,OFFSET commacall WriteStringloop L1call Crlfret
PrintArray ENDPEND

10:CMPSW : 比較兩個16位數組,找出第一個相同的值

.386
.model flat,stdcall.stack 4096
ExitProcess PROTO,dwEixtCode:DWORD.data
sourceW WORD 1,2,3,4,5
targetW WORD 5,4,3,2,1.code
main PROCmov esi,OFFSET sourceWmov edi,OFFSET targetWcldmov ecx,LENGTHOF sourceWrepne cmpswsub esi,TYPE WORDmov ax,[esi]INVOKE ExitProcess,0
main ENDP
END main

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/379303.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/379303.shtml
英文地址,請注明出處:http://en.pswp.cn/news/379303.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

編寫一個匯編語言程序,將字符串Hello World中的全部小寫字母轉換為大寫字母,并存放回原地址處。

編寫一個匯編語言程序&#xff0c;將字符串"Hello World"中的全部小寫字母轉換為大寫字母&#xff0c;并存放回原地址處。 P176 4.10 編程思路&#xff1a;首先DATA段中&#xff0c;定義string存放字符串"Hello World"&#xff0c;LEN為字符串string長度…

在Python中使用OpenCV(CV2)對圖像進行邊緣檢測

Modules used: 使用的模塊&#xff1a; For this, we will use the opencv-python module which provides us various functions to work on images. 為此&#xff0c;我們將使用opencv-python模塊&#xff0c;該模塊為我們提供了處理圖像的各種功能。 Download opencv-pytho…

需保留小數點兩位,但同時不要小數點后多余0的前后臺代碼實現

今天碰到一個需求。關于小數點的處理&#xff0c;看起來非常簡單的事情&#xff0c;卻花了一定時間做了一些試驗。最后簡單總結一下&#xff0c;以便備忘。 需求簡化一下表達是這樣的&#xff1a; 有A、B兩列&#xff0c;A/BC。這3列在數據庫中都以decimal存放。 在應用中&…

匯編語言-017(SCASW 、STRUCT 、STRUCT_ALLPOINTS 、STRUCT_ALIGN 、SYSTEMTIME、UNION 、 STRUCTTEST )

1&#xff1a;SCASW : 在wordArray中掃描16位數值0100h,將匹配元素的偏移量復制到EAX .386 .model flat,stdcall.stack 4096 ExitProcess PROTO,dwExitCode:DWORD.data wordArray WORD 0500h,0400h,0300h,0200h,0100h.code main PROCmov ax,0100hmov edi,OFFSET wordArraymov …

【筆記】正則表達式[1]

元字符 符號 意思 示范 詳例 \d 任意一個數字 \d{2}-\d{8} 22-12345678 * *前的符號重復任意次數 次數可以為零 \d* 222222222222... 或 2 \s 任意的空白符 全半角空格&#xff0c;tab&#xff0c;換行符 \bhi\b\s\bLucy\b hi Lucy 和*用法相似 次數>1 \d …

編寫一個匯編語言程序,完成以下要求。從BUF單元處定義有10個帶符號字數據:-1,3,24,94,62,72,55,0,-48,99,試找出他們中的最大值和平均值,并以此分別存放至該數據區的后兩個單元

編寫一個匯編語言程序&#xff0c;完成以下要求。從BUF單元處定義有10個帶符號字數據:-1,3,24,94,62,72,55,0,-48,99&#xff0c;試找出他們中的最大值和平均值&#xff0c;并以此分別存放至該數據區的后兩個單元中(假設這10個數的和值不超過16位范圍) P176 4.12 編程思路&am…

prototype 的ajax

原文&#xff1a;http://www.prototypejs.org/learn/introduction-to-ajax]翻 譯&#xff1a;www.ruby-china.cn 站長]Prototype框架提供了非常容易和有意思的方法處理Ajax的調用&#xff0c;同時它也是瀏 覽器安全的 。除了簡單的請求外&#xff0c;這個模塊&#xff08;指pro…

匯編語言-018(FLD 、FST、FSTP、FCHS、FABS 、浮點運算符、浮點比較 )

1&#xff1a;FLD : FPU&#xff08;浮點處理器&#xff09;的加載浮點數到堆棧指令 .386 .model flat,stdcall.stack 4096 ExitProcess PROTO,dwExitCode:DWORD.data array REAL8 10 DUP(?) dblOne REAL8 234.56 dblTwo REAL8 10.1.code main PROCfld array …

mcq 隊列_MCQ | 基礎知識 免費和開源軟件| 套裝4

mcq 隊列Q1. What do you call the technique of storing encrypted user passwords in Linux? Q1。 您如何稱呼在Linux中存儲加密的用戶密碼的技術&#xff1f; System Password Management 系統密碼管理 Shadow Password 影子密碼 Encrypted Password 加密密碼 None of the…

將AX寄存器中的16位數據分成4組(從高到低),每組4位,然后把這4組數作為數當中的低4位分別放在AL,BL,CL,DL中。

將AX寄存器中的16位數據分成4組&#xff08;從高到低&#xff09;&#xff0c;每組4位&#xff0c;然后把這4組數作為數當中的低4位分別放在AL&#xff0c;BL&#xff0c;CL&#xff0c;DL中。 P176 4.14 編程思路&#xff1a;首先用BX、DX存放AX&#xff0c;即原AX原BX原DX&…

一個很不錯的wp企業站模板

http://zjuhpp.com/chinese-localization-of-business-wordpress-theme-devster.html轉載于:https://www.cnblogs.com/i-kyle/archive/2012/09/13/2683817.html

著名的自由軟件圣戰- “KDE/QT .VS. Gnome/Gtk”

在 Unix 的圖形界面一向是以 MIT 的 X Window 系統為標準&#xff0c; 可是在商業應用上有兩大流派&#xff0c;一派是以 Sun 公司領導的 Openlook 陣營&#xff0c;一派是 IBM/HP 領導的OSF (Open Software Foundation) 的 Motif&#xff0c; 雙方經過多年競爭之后&#xff0c…

匯編語言-019(匯編程序與c\c++相互調用)

1&#xff1a;在C程序中使用__asm塊插入匯編代碼程序&#xff08;不能用LENGTHOF與SIZEOF運算符&#xff0c;而是LENGTH和SIZE&#xff09; struct Package {long originZip; //4long destinationzip;//4float shippingPrice; //4 };int main(int argcount,char* args[]) {c…

kotlin 判斷數字_Kotlin程序檢查數字是偶數還是奇數

kotlin 判斷數字Given a number N, we have to check whether it is EVEN or ODD. 給定數字N &#xff0c;我們必須檢查它是偶數還是奇數 。 Example: 例&#xff1a; Input:N 13Output:"ODD"Input:N 24Output:"EVEN"程序在Kotlin檢查偶數或奇數 (Prog…

微機原理與接口技術(第2版)考點

第一章 1&#xff0c;微型計算機的特點&#xff1a; 功能強、可靠性高價格低廉系統設計靈活&#xff0c;適應性強體積小&#xff0c;重量輕&#xff0c;維護方便 2&#xff0c;微型計算機的硬件組成 微處理器內存儲器I/O接口電路I/O設備系統總線 3&#xff0c;微機的工作過…

搜狗面試筆試一面二面全經歷

09.25 華科西十二教&#xff0c;搜狗招聘筆試&#xff1a; C搜索引擎研發。同時有威盛、烽火兩家筆試&#xff0c;就沒有去。 09.26 華科校內某酒店&#xff0c;搜狗一面&#xff1a; 筆試做的不錯&#xff0c;客觀題錯了3.5&#xff08;20個&#xff09;&#xff0c;后兩個算法…

UltraEdit語法高亮

語法加亮分支位于配置&#xff0d;編輯器顯示之下&#xff0c;允許用戶配置語法加亮選項&#xff1a;語法加亮可以識別預定詞語&#xff0c;并用不同顏色顯示它們。該功能對于程序員來說尤其有用&#xff0c;并且對那些想用不同顏色顯示文檔中詞語的用戶也非常有用。提供二十種…

線性代數 向量長度_用戶定義長度的向量| 使用Python的線性代數

線性代數 向量長度Prerequisite: Defining a vector 先決條件&#xff1a; 定義向量 Linear algebra is the branch of mathematics concerning linear equations by using vector spaces and through matrices. In other words, a vector is a matrix in n-dimensional space…

順序表(代碼、分析、匯編)

目錄&#xff1a;代碼&#xff1a;分析&#xff1a;匯編&#xff1a;代碼&#xff1a; SeqList.h #ifndef _SEQLIST_H_ #define _SEQLIST_H_ typedef void SeqList; //定義鏈表數據類型&#xff0c;void因為要適用不同鏈表數據類型 typedef void SeqListNode; //定義鏈表節…

設有兩個16位整數變量A和B,試編寫完成下述操作的程序。

設有兩個16位整數變量A和B&#xff0c;試編寫完成下述操作的程序。 &#xff08;1&#xff09;若有兩個數中一個是奇數&#xff0c;則將奇數存入A中&#xff0c;偶數存入B中。 &#xff08;2&#xff09;若兩個數均為奇數&#xff0c;則兩數分別減1&#xff0c;并存回原變量中…