汇编基础语法和指令总结+案例(用32位汇编实现插入排序)

简介: 汇编基础语法和指令总结+案例(用32位汇编实现插入排序)

前提知识

  • 常用指令

add指令

sub指令

mul乘法指令

div除法指令

inc(自增)(即++)

dec(自减)(即--)

cmp(比较)

  • 寄存器

EAX:累加器

多用于存放中间运算结果

EBX:基址寄存器

在间接寻址中用于存放基地址

ECX:计数寄存器

用于在循环或串操作指令中存放循环次数或重复次数;

EDX:数据寄存器

在32位乘除法运算时,存放高32位数

  • 分支结构

比较指令:

cmp x,y

跳转指令:

jmp, jXXX(ja, jb, jz)

cmp x, y 语义:

执行操作 x-y (xy的值不变),根据操作结果改 变EFLAG相应的位。

ja loc: xy是无符号数(程序员定义)且 x>y,则程序跳转到地址loc处执行

jz/je loc: xy是无符号数(程序员定义)且 x==y,则程序跳转到地址loc处执行

jb loc: xy是无符号数(程序员定义)且 x<y,则程序跳转到地址loc处执行

jg loc: xy是有符号数(程序员定义)且 x>y,则程序跳转到地址loc处执行

jz/je loc: xy是有符号数(程序员定义)且 x==y,则程序跳转到地址loc处执行

jl loc: xy是有符号数(程序员定义)且 x<y,则程序跳转到地址loc处执行

  • 输出输入

数据移送指令:mov dest,src

函数调用指令:Call f

输入输出函数

ReadInt PROC uses ebx ecx edx esi

输入:无

返回值:

CF=0, 输入存在EAX

CF=1, 输入无效,EAX=0

WriteInt proc

输入:显示的整数存在EAX

返回值: 无

  • 基础格式
1. INCLUDE Irvine32.inc
2. .data
3. .code
4. final:
5. exit
6. main ENDP
7. END main

案例

c的插入排序

1. void InsertSortArray ( int arr[], int n)
2.  {
3. int arr[]={2,99,3,1,22,88,7,77,54};
4. for (int i = 1; i < n; i++){
5. int temp = arr[i];
6. while (i >= 0 && arr[i - 1] > temp){
7. arr[i] = arr[i - 1];
8. i--;
9. }
10. arr[i] = temp;
11. }
12. }

32位汇编代码

1. INCLUDE Irvine32.inc
2. .data
3. arr dd 2,99,3,1,22,88,7,77,54
4. arr_len dd 9
5. a dd 1 ;直接下标
6. .code
7. main PROC
8.   mov ecx,arr_len ;数组长度
9.   mov edx,1 ;临时数值交换区间
10.   mov ebx,1 ;间接下标寻址,ebx=i
11.   sub ecx,1 ;外层循环次数
12.   again1:
13.     mov ebx,a
14.     mov eax,arr[ebx*4]  ;eax=temp
15.     jd:
16.     cmp ebx,0
17.     jb L1
18.     mov edx,ebx
19.     sub edx,1
20.     mov ESI,arr[edx*4]
21.     cmp ESI,eax
22.     jbe L1
23.     mov arr[ebx*4],ESI
24.     sub ebx,1
25.     jmp jd
26.     L1:
27.       mov arr[ebx*4],eax
28.       add a,1
29.       loop again1
30.   mov ebx,0
31.   again2:
32.     cmp ebx,arr_len
33.     jae final
34.     mov eax,arr[ebx*4]
35.     call WriteInt
36.     add ebx,1
37.     jmp again2
38.   final:
39. exit
40. main ENDP
41. END main

代码分析

这里通过ecx和loop控制外层循坏次数为len-1次以实现源代码中的for循环,从数组第二位开始插向前面的有序数列,这里对while中的判定条件进行取反,当不满足条件时跳出while循环,并将temp的值即为eax赋值给此时数组i下标的位置,while循环满足时依次将数组的元素后移腾出插入元素的位置,排序完成后call writenint循环将数组的元素打印出来即为有序数列

效果展示

目录
相关文章
|
4月前
|
存储 程序员
【汇编】“转移”综述、操作符offset、jmp指令
【汇编】“转移”综述、操作符offset、jmp指令
119 1
|
6天前
|
存储 C++
C/C++中的整数除法运算与汇编指令DIV和IDIV
C/C++中的整数除法运算与汇编指令DIV和IDIV
15 1
|
6天前
|
存储 安全 程序员
C/C++中的整数乘法运算与汇编指令MUL和IMUL
C/C++中的整数乘法运算与汇编指令MUL和IMUL
11 0
|
6天前
|
编译器 C++
C/C++中的逻辑运算与汇编指令的交互
C/C++中的逻辑运算与汇编指令的交互
8 0
|
6天前
|
编译器 程序员 C++
C/C++逻辑与运算与汇编指令的关系
C/C++逻辑与运算与汇编指令的关系
10 0
|
6天前
|
程序员
汇编语言中的带符号比较跳转指令
汇编语言中的带符号比较跳转指令
12 0
|
6天前
|
程序员
深入理解汇编:平栈、CALL和RET指令详解
深入理解汇编:平栈、CALL和RET指令详解
12 1
|
6天前
理解汇编中的CALL指令和参数传递
理解汇编中的CALL指令和参数传递
12 1
|
6天前
|
存储 程序员 开发者
深入理解汇编:push、pop、add、sub、lea 指令详解
深入理解汇编:push、pop、add、sub、lea 指令详解
12 1
|
4月前
汇编指令学习(寻址方式)
汇编指令学习(寻址方式)
22 0