C语言primcount素数计数,C语言与汇编的嵌入式编程:求100以内素数

写汇编之前,需要搞清楚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需要具体地址才可以进行,对于程序来讲不方便

a73e91bb682f2495764769060bcbd45c.png

然后查找资料,汇编中可以使用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");

}

343460262dae474ff25302e19f4bdd0b.png

在此基础上,我们

再实现一个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");

}

06b3fa52d4c575fefbcf67ebe11c6f91.png

最后在循环过程中,加上是否为素数的判断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以内的素数. ------------------------------------------------- 奇怪,求解素数的题,之前不是做过了吗?难道是想 ...

斐波那契数列(递归)&amp&semi;求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&plus;&plus; -----条款38:通过复合塑模出has-a或&OpenCurlyDoubleQuote;根据某物实现出”

复合(composition)的意义和public继承完全不同. 在应用域(application domain),复合意味has-a(有一个).在实现域(implementation domain) ...

Part 2&colon; 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&lpar;KB7-G RMQ&rpar;

Balanced Lineup Time Limit: 5000MS Memory Limit: 65536K   otal Submissions: 52651 Case Time Limit: 2 ...

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值