写汇编之前,需要搞清楚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以内的素数. ------------------------------------------------- 奇怪,求解素数的题,之前不是做过了吗?难道是想 ...

斐波那契数列(递归)&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 ...

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

  1. c语言 sqrt求100以内素数,C语言实现判断一个数是否为素数并求100以内的所有素数...

    判断一个数是否为素数 算法思想 设一个正整数x,sqrt(x)为x开平方后的值,若x不为素数,则x=a*b,a,b为2~x-1之间的整数,且当2=< a <= sqrt(x)时,必有sqr ...

  2. C语言——求100以内素数

    问题:求100以内素数? 质数(prime number)又称素数,有无限个.一个大于1的自然数,除了1和它本身外,不能被其他自然数整除. #include<stdio.h> int ma ...

  3. c语言求100以内被7整除的最大自然数,编程,求100以内被7整除的最大自然数

    java 编程,求1000以内能被17整除数的和 publicclassTest{publicstaticvoidmain(String[]args){intsum=0;for(inti=1;i c# ...

  4. 利用python求100以内素数之和

    利用python求100以内素数之和 python中简单函数的应用 #Prime def is_prime(n): #定义一个判断素数的函数for i in range(2,n): #判断是否能被除1 ...

  5. Python学习之---求100以内素数的八种解法

    题目: 求100以内所有的素数和个数 延伸:任意范围内的素数和前N个素数的和. 定义 何为素数?素数(又称为质数)就是在所有比1大的整数中,除了1和它本身以外,不再有别的因数,这种整数叫做质数.还可以 ...

  6. 求100以内素数的方法(筛选法,穷举法,穷举法优化)

    一.基本思想 //质数(素数)是指在大于1的自然数中除了1和它本身以外不再有其他因数的自然数. (1)判断一个数n是不是素数,可以用2到(int)sqrt(n)之间的所有整数去除n,看能否整除,如果都 ...

  7. Python求100以内素数的和。

    sum=0 for i in range(2,101):for j in range (2,i):if i%j==0:breakelse:sum+=i print(sum)

  8. c语言一个数等于素数的乘积,C语言实现判断一个数是否为素数并求100以内的所有素数...

    判断一个数是否为素数 算法思想 设一个正整数x,sqrt(x)为x开平方后的值,若x不为素数,则x=a*b,a,b为2~x-1之间的整数,且当2=< a <= sqrt(x)时,必有sqr ...

  9. java语言 判断素数,C语言实现判断一个数是否为素数并求100以内的所有素数

    判断一个数是否为素数 算法思想 设一个正整数x,sqrt(x)为x开平方后的值,若x不为素数,则x=a*b,a,b为2~x-1之间的整数,且当2=< a <= sqrt(x)时,必有sqr ...

最新文章

  1. 词移距离 Word Mover‘s Distance
  2. PlayMaker的特殊事件FINISHED
  3. Windows 10 中 Eclipse中无法添加Courier New字体的解决方法!
  4. 简单的js文本框提示语
  5. 安装 ZendServer-CE 可能遇到的问题
  6. deepin安装bochs2.6.2_2.kafka安装与使用
  7. Vue3.0 + pdf.js 实现pdf预览
  8. 微型计算机及接口技术笔记,2010年自考微型计算机及其接口技术笔记串讲
  9. nginx php 后缀名,nginx如何隐藏后缀名php
  10. 计算机word加边框,Word2010怎样为段落加上边框
  11. 80psi等于多少kpa_压力单位换算(如psi)
  12. 移动硬盘损坏怎么恢复?看完再也不怕丢失数据
  13. 六西格玛dfss_六西格玛设计DFSS.pdf
  14. 名帖96 赵孟頫 小楷《汉汲黯传》
  15. 华图教育_南京_前端实习面试
  16. Win10清理鼠标右键新建菜单
  17. 南阳百里奚计算机学校,南阳之子 百里奚
  18. 博弈背景下的记忆化搜索/题意理解 (HDU 2452 Navy maneuvers)
  19. 作为Android开发的你,还在对“快应用”无动于衷?
  20. 电磁波-麦克斯韦方程

热门文章

  1. 新手必看:揭秘德州扑克概率表
  2. SEO学习步骤--SEO入门第一章
  3. linux引导过程和服务控制
  4. 使用 Redis 实现自动补全功能
  5. 查询数据表中重复记录
  6. C++ 命名方式建议
  7. (int),Int32.Parse,Convert.ToInt3…
  8. ASP.NET Atlas简单控件介绍——InputControl,TextBox,Button和CheckBox
  9. python程序打包exe
  10. 【转】PHP的执行原理/执行流程