目录
前提知识
案例
c的插入排序
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 (x 与 y 的值不变 ), 根据操作结果改 变EFLAG 相应的位。ja loc: 若 x 与 y 是无符号数 ( 程序员定义 ) 且 x>y,则程序跳转到地址 loc 处执行jz/je loc: 若 x 与 y 是无符号数 ( 程序员定义 ) 且 x==y,则程序跳转到地址 loc 处执行jb loc: 若 x 与 y 是无符号数 ( 程序员定义 ) 且 x<y,则程序跳转到地址 loc 处执行jg loc : 若 x 与 y 是有符号数 ( 程序员定义 ) 且 x>y,则程序跳转到地址 loc 处执行jz/je loc : 若 x 与 y 是有符号数 ( 程序员定义 ) 且 x==y,则程序跳转到地址 loc 处执行jl loc : 若 x 与 y 是有符号数 ( 程序员定义 ) 且 x<y,则程序跳转到地址 loc 处执行
- 输出输入
数据移送指令:mov dest,src函数调用指令: Call f输入输出函数ReadInt PROC uses ebx ecx edx esi输入:无返回值:CF=0 , 输入存在 EAXCF=1 , 输入无效, EAX=0WriteInt proc输入:显示的整数存在 EAX返回值: 无
- 基础格式
INCLUDE Irvine32.inc
.data
.code
final:
exit
main ENDP
END main案例
c的插入排序
void InsertSortArray ( int arr[], int n)
 {
int arr[]={2,99,3,1,22,88,7,77,54};
for (int i = 1; i < n; i++){
int temp = arr[i];
while (i >= 0 && arr[i - 1] > temp){
arr[i] = arr[i - 1];
i--;
}
arr[i] = temp;
}
}32位汇编代码
INCLUDE Irvine32.inc
.data
arr dd 2,99,3,1,22,88,7,77,54
arr_len dd 9
a dd 1 ;直接下标
.code
main PROC
  mov ecx,arr_len ;数组长度
  mov edx,1 ;临时数值交换区间
  mov ebx,1 ;间接下标寻址,ebx=i
  sub ecx,1 ;外层循环次数
  again1:
    mov ebx,a
    mov eax,arr[ebx*4]  ;eax=temp
    jd:
    cmp ebx,0
    jb L1
    mov edx,ebx
    sub edx,1
    mov ESI,arr[edx*4]
    cmp ESI,eax
    jbe L1
    mov arr[ebx*4],ESI
    sub ebx,1
    jmp jd
    L1:
      mov arr[ebx*4],eax
      add a,1
      loop again1
  mov ebx,0
  again2:
    cmp ebx,arr_len
    jae final
    mov eax,arr[ebx*4]
    call WriteInt
    add ebx,1
    jmp again2
  final:
    exit
main ENDP
END main代码分析
这里通过ecx和loop控制外层循坏次数为len-1次以实现源代码中的for循环,从数组第二位开始插向前面的有序数列,这里对while中的判定条件进行取反,当不满足条件时跳出while循环,并将temp的值即为eax赋值给此时数组i下标的位置,while循环满足时依次将数组的元素后移腾出插入元素的位置,排序完成后call writenint循环将数组的元素打印出来即为有序数列
效果展示




















