注:此博客不再更新,所有最新文章将发表在个人独立博客limengting.site。分享技术,记录生活,欢迎大家关注
2、C语言编写多重循环程序,查看其反汇编码,分析各条语句功能,并采用汇编语言编写相同功能程序。
(1)冒泡排序
汇编代码:
;冒泡排序实现数组从小到大排序
.386
.model flat,stdcall
option casemap:none
includelib msvcrt.lib
printf PROTO C:dword,:vararg
.data
array dword 20,15,70,30,32,89,12 ;等待被排序的数组
items equ ($ - array) / 4 ;数组元素的个数
szFmt byte 'array[%d] = %d', 0ah, 0 ;输出结果格式字符串
.code
start:
mov ECX, items - 1 ;ECX相当于数组最大下标
i10: ;外层循环起始处
xor ESI, ESI ;ESI计数
i20: ;内层循环起始处
mov EAX, array[ESI * 4]
mov EBX, array[ESI * 4 + 4]
cmp EAX, EBX
JL i30 ;JL 两个带符号数的比较,小于则跳转,EAX\EBX不进行交换
mov array[ESI * 4], EBX
mov array[ESI * 4 +4], EAX
i30:
inc ESI;
cmp ESI, ECX
JB i20 ;JB 两个无符号数的比较,小于表示不越界则跳转进行内层循环
loop i10 ;外层循环
xor EDI, EDI
i40: ;输出
invoke printf, offset szFmt, EDI, array[EDI * 4]
inc EDI
cmp EDI, items
JB i40
ret
end start
C语言:
#include <stdio.h>
int main()
{
int array[7] = { 20,15,70,30,32,89,12 };
for (int i = 0; i < 6; i++)
{
for (int j = 0; j < 6; j++)
if (array[j] > array[j + 1])
{
int temp = array[j];
array[j] = array[j + 1];
array[j + 1] = temp;
}
}
for (int i = 0; i < 7; i++)
{
printf("array[%d]=%d", i, array[i]);
printf("\n");
}
return 0;
}
(2)插入排序
汇编代码:
;插入排序
.386
.model flat,stdcall
option casemap:none
includelib msvcrt.lib
printf PROTO C:dword,:vararg
;ESI = i
;EDI = j
;EDX = tmp = array[i] = array[ESI * 4]
;EBX = array[j] = array[EDI * 4]
.data
array dword 20,15,70,30,32,89,12 ;等待被排序的数组
len equ ($ - array) / 4 ;数组