原始C语言:

#include<stdio.h>
void main(){ char str[];
char pipei[] = "abcdefghijklmnopqrstuvwxyz";
int count[]={};
int i=,j=; scanf("%s",str);
printf("%s\n",str); for(i=;i<;i++)
{
for(j=;j<;j++)
{
if(str[i]==pipei[j])
count[j]+=;
}
} for(j=;j<;j++)
{
if(count[j]>)
printf("%c=%d\n",pipei[j],count[j]);
}
}

加入汇编后代码:

#include<stdio.h>
void main(){ char str[];
char pipei[] = "abcdefghijklmnopqrstuvwxyz";
int count[]={};
int i=,j=; scanf("%s",str);
printf("%s\n",str); //外层循环start
_asm{
mov eax, //i=0
mov ecx, //i<1024
loop1:
mov i,eax
push eax
push ecx
};
//printf("%c\t",str[i]); //内层循环start
_asm{
mov eax,
mov ecx,
loop2:
mov j,eax
push eax
push ecx
}; if(str[i]==pipei[j])
{
count[j]+=;
} //内循环end
__asm{
pop ecx
pop eax
add eax,
loop loop2
}; //外循环end
_asm{
pop ecx
pop eax
add eax,
loop loop1
}; //输出统计个数
//外层循环start
_asm{
mov eax, //i=0
mov ecx, //i<26
loop3:
mov j,eax
push eax
push ecx
}; if(count[j]>)
printf("%c=%d\n",pipei[j],count[j]); //外循环end
_asm{
pop ecx
pop eax
add eax,
loop loop3
}; }

后面有时间再优化了。。。。

优化如下:

需要掌握的知识  if语句的汇编表示

构造单循环:

#include<stdio.h>
void main(){ char str[];
char pipei[] = "abcdefghijklmnopqrstuvwxyz";
int count[]={};
int i=,j=; char *str1 = "i=%d\n";
char *str2 = "%d=%c\t"; scanf("%s",str);
printf("%s\n",str); printf(str2,i,str[i]);
//mov edx,dword ptr [ebp-48Ch]
//movsx eax,byte ptr [ebp+edx-400h]
//push eax
//mov ecx,dword ptr [ebp-48Ch]
//push ecx
//mov edx,dword ptr [ebp-498h]
//push edx
//call printf (0040d6c0)
//add esp,0Ch
// ==
//mov edx, i
//movsx eax,str[edx]
//push eax
//mov ecx,i
//push ecx
//mov edx,str2
//push edx
//call printf
//add esp,12 //12=3个变量*4 _asm{
mov i, //i=0
start_1024: nop
mov eax,i
add eax,
mov i,eax //i++ cmp i, // if i<10
jge end_1024 //逐个输出 printf(str2,str[i]);
mov edx, i
movsx eax,str[edx]
push eax
mov ecx,i
push ecx
mov edx,str2
push edx
call printf
add esp, //12=3个变量*4 jmp start_1024 //for 1024 end_1024: nop
}
}

进一步构造嵌套循环:

#include<stdio.h>
void main(){ char str[];
char pipei[] = "abcdefghijklmnopqrstuvwxyz";
int count[]={};
int i=,j=; char *str1 = "i=%d\n";
char *str2 = "\n第一层循环%d=%c\n";
char *str3 = "%d=%c\t"; scanf("%s",str);
printf("%s\n",str); printf(str2,i,str[i]); _asm{
//第一个外循环
mov i, //i=0
start_1024: nop
mov eax,i
add eax,
mov i,eax //i++
cmp i, // if i<10
jge end_1024 //第二个内循环
mov j, //j=0
start_26: nop
mov eax,j
add eax,
mov j,eax //j++
cmp j,
jge end_26 //逐个输出pipei
mov edx, j
movsx eax,pipei[edx]
push eax
mov ecx,j
push ecx
mov edx,str3
push edx
call printf
add esp, //12=3个变量*4 jmp start_26 //for 1024
end_26: nop //逐个输出 printf(str2,str[i]);
mov edx, i
movsx eax,str[edx]
push eax
mov ecx,i
push ecx
mov edx,str2
push edx
call printf
add esp, //12=3个变量*4 jmp start_1024 //for 1024 end_1024: nop } }

加入判断与统计输出代码:

#include<stdio.h>
void main(){
char str[];
char pipei[] = "abcdefghijklmnopqrstuvwxyz";
int count[]={};
int i=,j=; char *str1 = "i=%d\n";
char *str2 = "\n第一层循环%d=%c\n";
char *str3 = "i=%d,j=%d,c=%c\t";
char *str4 = "%c=%d\t"; scanf("%s",str);
printf("%s\n",str); _asm{
//第一个外循环
mov i,- //i=0
start_1024: nop
mov eax,i
add eax,
mov i,eax //i++
cmp i, // if i<1024
jge end_1024 //判断第i个字符串是否为结束符,如果是则退出总循环
movsx eax,str[eax]
cmp eax,0h
je end_1024 // \n第一层循环%d=%c\n printf(str2,i,str[i]);
mov edx, i
movsx eax,str[edx]
push eax
mov ecx,i
push ecx
mov edx,str2
push edx
call printf
add esp, //12=3个变量*4 //第二个内循环
mov j,- //j=-1
start_26: nop
mov eax,j
add eax,
mov j,eax //j++
cmp j,
jge end_26 //逐个输出 "i=%d,j=%d,c=%c\t"; pipei
mov edx, j
movsx eax,pipei[edx]
push eax
mov ecx,j
push ecx
mov ecx,i
push ecx
mov edx,str3
push edx
call printf
add esp, //12=4个变量*4 //判断str[i]是否与pipei[j]相等,相等加一并退出第二循环
//if(str[i]==pipei[j])
mov edx,i
movsx eax,str[edx]
mov ecx,j
movsx edx,pipei[ecx]
cmp eax,edx
jne end_count//不相等
//{count[j]+=1 //相等
mov eax,j
mov ecx,count[eax*]
add ecx,
mov edx,j
mov count[edx*],ecx
//break;
jmp start_1024 //如果找到一个匹配的,则退出第二循环 end_count: nop
jmp start_26 //for 26
end_26: nop jmp start_1024 //for 1024
end_1024: nop
//到这里统计算法已经结束 //输出统计个数
mov j,- //j=-1
start_all: nop
mov eax,j
add eax,
mov j,eax //j++
cmp j,
jge end_all //逐个输出printf(str4,pipei[j],count[j]);
mov edx,j
mov ecx,count[edx*]
push ecx
movsx eax,pipei[edx]
push eax
mov edx,str4
push edx
call printf
add esp, //12=3个变量*4 jmp start_all //for 26
end_all: nop }
}

C语言与汇编的嵌入式编程:统计字符串中各字符出现的次数的更多相关文章

  1. 统计字符串中每个字符出现的次数(Python)

    #统计字符串中每个字符出现的次数 以The quick brown fox jumps over the lazy dog为例 message='The quick brown fox jumps o ...

  2. Java基础知识强化之集合框架笔记61:Map集合之统计字符串中每个字符出现的次数的案例

    1. 首先我们看看统计字符串中每个字符出现的次数的案例图解: 2. 代码实现: (1)需求 :"aababcabcdabcde",获取字符串中每一个字母出现的次数要求结果:a(5) ...

  3. 使用Map,统计字符串中每个字符出现的次数

    package seday13; import java.util.HashMap; import java.util.Map; /** * @author xingsir * 统计字符串中每个字符出 ...

  4. Java中统计字符串中各个字符出现的次数

    import java.util.Iterator; import java.util.Set; import java.util.TreeMap; public class TreeMapDemo ...

  5. javascript 统计字符串中每个字符出现的次数

    var str = "abdcadfasfdbadfafdasdfasyweroweurowqrewqrwqrebwqrewqrejwq;;"; // console.log(nu ...

  6. Java案例——统计字符串中各种字符出现的次数

    /*案例:统计各种字符在字符串中出现的次数 分析:只考虑三种字符类型的情况下(大写字母,小写字母,数字) 1.使用Scanner 类获取字符串数据 2.遍历字符串得到每一个字符 3.判断每一个字符是那 ...

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

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

  8. loadrunner统计字符串中指定字符出现的次数

    Action() { char *str="sdfas1,sdfsdf2,sdfsdfsdfdsf3,sdfsdfsdfsdfds4,fsdfdsf5,sdfdsfsd6,fsdfsd7sd ...

  9. 【面试题总结】1、统计字符串中某个字符出现的次数(2-Python实现)

    1.可以使用Python的字典实现,对于一个特定的字符串,使用for循环遍历其中的字符,并保存成字典形式.字典的key为字符,value为字符在整个字符串中出现的次数. 2.拓展:如果题目为比较两个字 ...

随机推荐

  1. MySQL | linux中数据库导出和导入

    一.数据库导出(深坑) 命令:mysqldump -u用户名 -p密码 要导出的数据库 > 导出之后的文件.sql mysqldump -uroot -p database_01 > da ...

  2. 《深入理解Java虚拟机》读书笔记一

    第二章 Java内存区域与内存溢出异常 1.运行时数据区域 程序计数器: 当前线程所执行的字节码的行号指示器,用于存放下一条需要运行的指令. 运行速度最快位于处理器内部. 线程私有. 虚拟机栈: 描述 ...

  3. orcad常用库文件

    ORCAD CAPTURE元件库介绍 AMPLIFIER.OLB amplifier 共182个零件,存放模拟放大器IC,如CA3280,TL027C,EL4093等. ARITHMETIC.OLB ...

  4. js清空子节点

    删除全部子节点 function removeAllChild(){ var div = document.getElementById("div1"); while(div.ha ...

  5. 并查集-G - 食物链

    G - 食物链 动物王国中有三类动物A,B,C,这三类动物的食物链构成了有趣的环形.A吃B, B吃C,C吃A.现有N个动物,以1-N编号.每个动物都是A,B,C中的一种,但是我们并不知道它到底是哪一种 ...

  6. .net_DevExpress控件使用经验总结

    (转)DevExpress控件使用经验总结DevExpress是一个比较有名的界面控件套件,提供了一系列的界面控件套件的DotNet界面控件.本文主要介绍我在使用DevExpress控件过程中,遇到或 ...

  7. vue里不同数据的循环,其中的数组对象

    用产品的属性数据说明 页面里显示效果为:要把产品的属性显示到页面上,产品属性为后台自主上传产品的属性,产品的属性不同,所以需要把属性和属性值显示到页面上 产品属性数据为: properties: &q ...

  8. git免密拉取代码

    里介绍通过ssh公钥的方式免密拉取代码 以linux服务器为例,windows方式是一样的 1.用命令生成ssh key ssh-keygen -t rsa -C "xx@xxxcom&qu ...

  9. jvm(3):JVM调优

    typora-root-url: ./ JVM调优思路 目的:减少full GC次数.减少STW时间(一次GC的时间) 手段: 打印GC日志-XX:+PrintGCDetails -XX:+Print ...

  10. C++-POJ3349-Snowflake Snow Snowflakes[STL][set][hash未写]

    错误AC解法,sort+set判重,为考虑异构! 比较坑的一点是读入时scanf一定要一次读6个数,不然会TLE #include <set> #include <map> # ...