写汇编之前,需要搞清楚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以内素数的更多相关文章

  1. python求100以内素数

    python求100以内素数之和 from math import sqrt # 使用isPrime函数 def isPrime(n): if n <= 1: return False for ...

  2. C语言与汇编的嵌入式编程:统计字符串中各字符出现的次数

    原始C语言: #include<stdio.h> void main(){ ]; char pipei[] = "abcdefghijklmnopqrstuvwxyz" ...

  3. C语言与汇编的嵌入式编程:main中模拟函数的调用(两数交换)

    编写一个两数交换函数swap,具体代码如下: #include<stdio.h> void swap(int *p1,int *p2) { int temp; temp = *p1; *p ...

  4. Java简单算法--求100以内素数

    package cn.magicdu.algorithm; /** * 打印素数 * * @author xiaoduc * */ public class Prim { public static ...

  5. while做法1.兔子生兔子 2.求100以内质数的和3.洗发水15元 牙膏5元 香皂2元 150元的算法

    1.兔子生兔子 2.求100以内质数的和 3.150块钱花完问题

  6. while:1.兔子生兔子问题 2.打印菱形 3.求100以内质数的和4.洗发水15元一瓶,牙膏5元一支,香皂2元一块,150元刚好花完

    1.兔子生兔子问题: 2.打印菱形 3.求100以内质数的和 4.洗发水15元一瓶,牙膏5元一支,香皂2元一块,150元刚好花完有多少种情况?

  7. for嵌套:1.兔子生兔子问题 2.打印菱形 3.求100以内质数的和

    1.兔子生兔子问题 方法一: 方法二: 2.打印菱形 3.求100以内质数的和

  8. Python练习题 026:求100以内的素数

    [Python练习题 026] 求100以内的素数. ------------------------------------------------- 奇怪,求解素数的题,之前不是做过了吗?难道是想 ...

  9. 斐波那契数列(递归)&求100以内的素数

    Java 5 添加了 java.util.Scanner 类,这是一个用于扫描输入文本的新的实用程序.它是以 前的 StringTokenizer 和 Matcher 类之间的某种结合.由于任何数据都 ...

随机推荐

  1. 2019牛客竞赛第六场D Move 宏观单调,部分不单调

    Move 题意 有k个体积相同的箱子,有个憨憨有固定的装箱策略,每次都只装可以装的重量中最大的东西,求箱子的最小提及 分析 看起来可以二分,但由于他的装箱策略有点蠢,所以只在宏观上满足单调性,在特别小 ...

  2. 基于Android的在线播放器系统的设计与实现

    文章结构: 1 引言 1.1系统的研究背景 现在的时代是互联网的时代,互联网高速发展的同时,无线网络也接入了互联网.社会的各个领域都已经被无线网络渗透.小的比如手机,电脑,电视.大的比如灯光系统,智能 ...

  3. POJ 3264 Balanced Lineup(ST模板)

    链接:http://poj.org/problem?id=3264 题意:给n个数,求一段区间L,R的最大值 - 最小值,Q次询问 思路:ST表模板,预处理区间最值,O(1)复杂度询问 AC代码: # ...

  4. thinkphp中简单的控制器使用

    1.在路由(route.php)中定义一条路由 Route::rule('new/:name/:id','index/News/read'); 2.在index下的controller控制器中新建一个 ...

  5. 快速排序 QuickSort (C++迭代,递归)

    /* * QuickSort.h * 快速排序(将每一个元素转换为轴点元素) * Created on: 2020年2月12日 * Author: LuYonglei */ #ifndef SRC_Q ...

  6. LED Decorative Light Manufacturer - LED Neon Rope: 5 Advantages

    In the past 100 years, lighting has come a long way. Nowadays, the decorative LED lighting design ca ...

  7. HTTP头部字段总结【转】

    原作者: 留七七, 地址:http://www.jianshu.com/p/6e86903d74f7 一.常用标准请求头字段 Accept  设置接受的内容类型 Accept-Charset    设 ...

  8. django入门(一)

    小白一枚,老是感觉自己学了点什么东西马上就忘了,所以打算写点下来,以后可以看看,也希望能给以后点进来的人有一些帮助 本文是django的入门,现在在学,有错误之处还希望能包涵和指出,谢谢! 首先先下载 ...

  9. mescroll.js简单的上拉加载、下拉刷新插件,带完整注释

    声明:本插件模仿自mescroll.js,随手所作,仅以注释提供思路,只实现了部分效果,且没有考虑兼容,有兴趣的朋友随意一看.api大家可参考mescroll.js API汇总一文. demo:点我下 ...

  10. 【原】linux增加开机自启动脚本

    在rc.local脚本中添加开机自启动程序