前提知识
- 常用指令
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, 输入存在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循环将数组的元素打印出来即为有序数列
效果展示