C语言与汇编的嵌入式编程:求100以内素数
写汇编之前,需要搞清楚C语言代码的写法,这里以最简单的算法举例说明
C代码如下:
#include <stdio.h>
void main(){ int i,j;
int count=; for(i=;i<=;i++)
{
for(j=;j<i/;j++)
{
if(i%j==)
{
count=;
break;
}
} if(count == )
{
printf("%d\n",i);
}
count = ;
}
}
由于C语言中使用的是for进行循环,使用VC调试汇编时,发现for汇编的jmp需要具体地址才可以进行,对于程序来讲不方便

然后查找资料,汇编中可以使用loop循环,因此,先实现一个loop循环
#include <stdio.h>
void main(){ //test loop
_asm{ mov ax, mov cx, s:add ax,ax loop s };
}
进一步,我们在loop循环里面加上printf输出语句
#include <stdio.h>
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 <stdio.h>
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<i
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 <stdio.h>
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<i
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步的判断等其他语句再统一转换成汇编代码。
C语言与汇编的嵌入式编程:求100以内素数的更多相关文章
- python求100以内素数
python求100以内素数之和 from math import sqrt # 使用isPrime函数 def isPrime(n): if n <= 1: return False for ...
- C语言与汇编的嵌入式编程:统计字符串中各字符出现的次数
原始C语言: #include<stdio.h> void main(){ ]; char pipei[] = "abcdefghijklmnopqrstuvwxyz" ...
- C语言与汇编的嵌入式编程:main中模拟函数的调用(两数交换)
编写一个两数交换函数swap,具体代码如下: #include<stdio.h> void swap(int *p1,int *p2) { int temp; temp = *p1; *p ...
- Java简单算法--求100以内素数
package cn.magicdu.algorithm; /** * 打印素数 * * @author xiaoduc * */ public class Prim { public static ...
- while做法1.兔子生兔子 2.求100以内质数的和3.洗发水15元 牙膏5元 香皂2元 150元的算法
1.兔子生兔子 2.求100以内质数的和 3.150块钱花完问题
- while:1.兔子生兔子问题 2.打印菱形 3.求100以内质数的和4.洗发水15元一瓶,牙膏5元一支,香皂2元一块,150元刚好花完
1.兔子生兔子问题: 2.打印菱形 3.求100以内质数的和 4.洗发水15元一瓶,牙膏5元一支,香皂2元一块,150元刚好花完有多少种情况?
- for嵌套:1.兔子生兔子问题 2.打印菱形 3.求100以内质数的和
1.兔子生兔子问题 方法一: 方法二: 2.打印菱形 3.求100以内质数的和
- Python练习题 026:求100以内的素数
[Python练习题 026] 求100以内的素数. ------------------------------------------------- 奇怪,求解素数的题,之前不是做过了吗?难道是想 ...
- 斐波那契数列(递归)&求100以内的素数
Java 5 添加了 java.util.Scanner 类,这是一个用于扫描输入文本的新的实用程序.它是以 前的 StringTokenizer 和 Matcher 类之间的某种结合.由于任何数据都 ...
随机推荐
- 2019牛客多校第五场 G subsequence 1 dp+组合数学
subsequence 1 题意 给出两个数字串s,t,求s的子序列中在数值上大于t串的数量 分析 数字大于另一个数字,要么位数多,要么位数相同,字典序大,位数多可以很方便地用组合数学来解决,所以只剩 ...
- TD - 单选框 - RadioButton
基本方法 Html - 默认选中 //checked="true" - 默认选中 <input dojoType="bootstrap.form.RadioButt ...
- 月薪20k的web前端开发程序员,他们都会的这6招
web前端工程师是近几年的新兴职业,也是目前火爆而且高薪的职业.不同的公司也有不同的叫法,比如:网页界面开发,网站设计等,要学好web前端开发,需要掌握什么方法与技巧? 一.div和table 这个是 ...
- vga显示原理即相关计算
行扫描周期:完成一行扫描所需时间: 行时序时间(a,b,c,d,e):完成一个像素点显示得时间 场扫描周期:完成所有行(一帧扫描所需时间) 场时序时间(o,p,q,r,s):完成一行显示得时间,一个完 ...
- k8s集群问题记录
k8s集群问题记录 k8s学习方案 问题解决思路 主要学习路径: rancher(k8s)->rke->helm->kubectl->k8s(k8s中文api) 常见问题总结: ...
- 杭电ACM 1713 相遇周期
相遇周期 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submis ...
- 【原】AMFObject数据格式详解
AMF AMF是Action Message Format(动作消息格式)的简写,它是一种二进制的数据格式.它的设计是为了把actionscript里面的数据(包括Object, Array, Boo ...
- Python记:列表和元组之序列相加
_______________坐而论道,不如起而行之! 序列乘法运算示例:
- PTPX-功耗分析总结
使用PrimeTime PX进行功耗分析有两种:一种是平均功耗的分析Averaged power analysis,一种是Time-based power analysis. 电路的功耗主要有两种 ...
- ios 下 select和option 无法隐藏指定元素
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...