汇编语言-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.mzph.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;并存回原变量中…