写汇编之前,需要搞清楚C语言代码的写法,这里以最简单的算法举例说明
C代码如下:
#include
void main(){
int i,j;
int count=;
for(i=;i<=;i++)
{
for(j=;j
{
if(i%j==)
{
count=;
break;
}
}
if(count == )
{
printf("%d\n",i);
}
count = ;
}
}
由于C语言中使用的是for进行循环,使用VC调试汇编时,发现for汇编的jmp需要具体地址才可以进行,对于程序来讲不方便
然后查找资料,汇编中可以使用loop循环,因此,先实现一个loop循环
#include
void main(){
//test loop
_asm{
mov ax,
mov cx,
s:add ax,ax
loop s
};
}
进一步,我们在loop循环里面加上printf输出语句
#include
void main(){
int i=0xA; // dword ptr [ebp-4],0Ah
int j=0xB; // dword ptr [ebp-8],0Bh
int count=; // dword ptr [ebp-0Ch],1
//第一个循环start
_asm{
mov eax, // i=2
mov ecx, // i<100
loop1: // 开始循环1
mov i,eax // 保存i
push eax // push eax和ecx到堆栈,是因为程序调用printf函数后,会改变ecx的值,所以需要先记录下来,再通过pop ecx和eax还原原来的eax和ecx的值
push ecx
};
printf("\n\n第一层循环i=%d\n",i);
//第一个循环end
_asm{
pop ecx
pop eax
add eax, // i++
loop loop1
};
printf("ssssssssss");
}
在此基础上,我们
再实现一个loop循环里面嵌入一个loop循环,即可达到for循环里面嵌套for循环的目的
#include
void main(){
int i=0xA; // dword ptr [ebp-4],0Ah
int j=0xB; // dword ptr [ebp-8],0Bh
int count=; // dword ptr [ebp-0Ch],1
//第一个循环start
_asm{
mov eax, // i=2
mov ecx, // i<100
loop1: // 开始循环1
mov i,eax // 保存i
push eax // push eax和ecx到堆栈,是因为程序调用printf函数后,会改变ecx的值,所以需要先记录下来,再通过pop ecx和eax还原原来的eax和ecx的值
push ecx
};
printf("\n\n第一层循环i=%d\n",i);
//第二个循环start
_asm{
mov eax, // j=2
mov ecx,i // j
sub ecx, // j=i-2
loop2: // 开始循环2
mov j,eax // 保存j
push eax // push eax和ecx到堆栈,是因为程序调用printf函数后,会改变ecx的值,所以需要先记录下来,再通过pop ecx和eax还原原来的eax和ecx的值
push ecx
};
printf("j=%d\t",j);
//第二个循环end
_asm{
pop ecx
pop eax
add eax, // j++
loop loop2
};
//第一个循环end
_asm{
pop ecx
pop eax
add eax, // i++
loop loop1
};
printf("ssssssssss");
}
最后在循环过程中,加上是否为素数的判断if语句,即可简单实现C语言与汇编的嵌入式编程。
改造后的代码:
#include
void main(){
int i=0xA; // dword ptr [ebp-4],0Ah
int j=0xB; // dword ptr [ebp-8],0Bh
int count=; // dword ptr [ebp-0Ch],1
//第一个循环start
_asm{
mov eax, // i=2
mov ecx, // i<100
loop1: // 开始循环1
mov i,eax // 保存i
push eax // push eax和ecx到堆栈,是因为程序调用printf函数后,会改变ecx的值,所以需要先记录下来,再通过pop ecx和eax还原原来的eax和ecx的值
push ecx
};
printf("\n\n第一层循环i=%d\n",i);
//第二个循环start
_asm{
mov eax, // j=2
mov ecx,i // j
sub ecx, // j=i-2
loop2: // 开始循环2
mov j,eax // 保存j
push eax // push eax和ecx到堆栈,是因为程序调用printf函数后,会改变ecx的值,所以需要先记录下来,再通过pop ecx和eax还原原来的eax和ecx的值
push ecx
};
//判断是否为素数
if(i%j==)
{
count+=;
}
/*
_asm{
//if(i%j==0)
mov eax,i
cdq
idiv eax,j
test edx,edx
jne loop2+2Ah (0040d822)
//{
//count+=1;
mov edx,dword ptr [ebp-0Ch]
add edx,1
mov dword ptr [ebp-0Ch],edx
//}
}*/
printf("j=%d,count=%d\t",j,count);
//第二个循环end
_asm{
pop ecx
pop eax
add eax, // j++
loop loop2
};
if(count ==)
{
printf("%d是素数\n",j);
}
count =;
//第一个循环end
_asm{
pop ecx
pop eax
add eax, // i++
loop loop1
};
printf("ssssssssss");
}
最后,还可以将if,printf等转换为汇编
总结下思路;
1、先用C语言写好一个算法程序
2、使用loop代替for循环
3、在loop循环中加入printf输出语句,实现循环变量值得打印
4、在loop循环中嵌入loop循环
5、加上判断等其他语句
6、再将第5步的判断等其他语句再统一转换成汇编代码。
python求100以内素数
python求100以内素数之和 from math import sqrt # 使用isPrime函数 def isPrime(n): if n <= 1: return False for ...
C语言与汇编的嵌入式编程:统计字符串中各字符出现的次数
原始C语言: #include void main(){ ]; char pipei[] = "abcdefghijklmnopqrstuvwxyz" ...
C语言与汇编的嵌入式编程:main中模拟函数的调用(两数交换)
编写一个两数交换函数swap,具体代码如下: #include void swap(int *p1,int *p2) { int temp; temp = *p1; *p ...
Java简单算法--求100以内素数
package cn.magicdu.algorithm; /** * 打印素数 * * @author xiaoduc * */ public class Prim { public static ...
Python练习题 026:求100以内的素数
[Python练习题 026] 求100以内的素数. ------------------------------------------------- 奇怪,求解素数的题,之前不是做过了吗?难道是想 ...
斐波那契数列(递归)&;求100以内的素数
Java 5 添加了 java.util.Scanner 类,这是一个用于扫描输入文本的新的实用程序.它是以 前的 StringTokenizer 和 Matcher 类之间的某种结合.由于任何数据都 ...
随机推荐
分享一个MySQL分库分表备份脚本(原)
分享一个MySQL分库备份脚本(原) 开发思路: 1.路径:规定备份到什么位置,把路径(先判断是否存在,不存在创建一个目录)先定义好,我的路径:/mysql/backup,每个备份用压缩提升效率,带上 ...
Android之drawable state各个属性详解
android:drawable 放一个drawable资源android:state_pressed 是否按下,如一个按钮触摸或者点击.android:state_focused 是否取得焦点,比如 ...
mysql 数据库隔离级别
select @@tx_isolation; 4种隔离级别 1.read uncommitted 2.read committed 3.repeatable read(MySQL默认隔离级别) 4. ...
Effective C++ -----条款38:通过复合塑模出has-a或“根据某物实现出”
复合(composition)的意义和public继承完全不同. 在应用域(application domain),复合意味has-a(有一个).在实现域(implementation domain) ...
Part 2: Oracle E-Business Suite on Cloud FAQ
Running Oracle E-Business Suite on Oracle Cloud is simple, but it doesn't take too much effort to co ...
【嵌入式开发板】8月终极暑促迅为Cortex-a9四核入门开发板
核心板参数 尺寸 50mm*60mm 高度 连同连接器在内0.26cm CPU Exynos4412,四核Cortex-A9,主频为1.4GHz-1.6GHz 内存 1GB 双通道 DDR3(2GB ...
关于mybatis组合查询的分析
mybatis 查询思路 第一种思路: 1:先查询,编写查询语句: 2:查询出结果后,将ResultMap 进行拆分, 组合成想要的模型: 这种思路是将联合查询语句组合成一个ResultMap; &l ...
Git stash方法(转)
命令:git stash1.使用git stash保存当前的工作现场,那么就可以切换到其他分支进行工作,或者在当前分支上完成其他紧急的工作,比如修订一个bug测试提交. 2.如果一个使用了一个git ...
磁盘IO:缓存IO与直接IO
文件系统IO分为DirectIO和BufferIO,其中BufferIO也叫Normal IO. 1. 缓存IO 缓存I/O又被称作标准I/O,大多数文件系统的默认I/O操作都是缓存I/O.在Linu ...
POJ3264(KB7-G RMQ)
Balanced Lineup Time Limit: 5000MS Memory Limit: 65536K otal Submissions: 52651 Case Time Limit: 2 ...