找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1868|回复: 19
收起左侧

C语言字符串核对匹配居然还能这样写,真是万能的指针

  [复制链接]
ID:688692 发表于 2022-6-30 10:20 | 显示全部楼层 |阅读模式
if(SBUF==((unsigned char code *)"关闭投球")[j])

编译得到的汇编代码:
效率一点不受影响。

   589:                 if(SBUF==((unsigned char code *)"开启投球")[ i])
C:0x16C8    E52B     MOV      A,0x2B
C:0x16CA    900208   MOV      DPTR,#0x0208
C:0x16CD    93       MOVC     A,@A+DPTR
C:0x16CE    B59911   CJNE     A,SBUF(0x99),C:16E2
   590:                 {
   591:                         i++;
C:0x16D1    052B     INC      0x2B

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:883242 发表于 2022-7-11 23:18 | 显示全部楼层
Y_G_G 发表于 2022-7-11 21:34
C有时候效率是比汇编高的,并不是说汇编效率低,而是写这个汇编的人技术不行,导致写出一堆比C效率还低的代 ...

看平台,像ARM这种RISC结构的,很难写出比c编译器效率更高的代码,很多人一看RISC不就是精简指令集吗?很简单,但实际上精简指令集的复杂组合是非常难于掌握的,我见过几个试图写ARM汇编的,没人能写出比c编译器效率更高的代码。

8位单片机是另一个故事了,像STM8源自曾经是高大上CPU的6502,写出比c编译器更高效的汇编也挺难,但是能做到。8051的结构要简陋的多,写出比c编译器高的代码相对容易。最蹩脚的是Microchip PIC16单片机,设计之初的目标是用最少的晶体管数量实现完整功能,就没想过用高级语言,c编译器出来的代码怎么看怎么拧巴和不顺眼,这种单片机只要智力正常,不可能写出比c编译器更垃圾的代码。
回复

使用道具 举报

ID:401564 发表于 2022-7-11 21:34 | 显示全部楼层
jizhongbiao 发表于 2022-7-11 19:07
C怎么可能比汇编效率高。

C有时候效率是比汇编高的,并不是说汇编效率低,而是写这个汇编的人技术不行,导致写出一堆比C效率还低的代码出来
并不是每个用汇编的都是高手,在这个时候,汇编效率就要比C低,而且更容易出问题
我当初刚开始学汇编的时候,经常出现这种问题,现在也一样,所以,我改用C了
回复

使用道具 举报

ID:130230 发表于 2022-7-11 19:07 | 显示全部楼层
C怎么可能比汇编效率高。
回复

使用道具 举报

ID:1008383 发表于 2022-7-11 16:31 | 显示全部楼层
可以,指针还是很方便的
回复

使用道具 举报

ID:887371 发表于 2022-7-4 15:03 | 显示全部楼层
xiaoyuxinke 发表于 2022-7-3 11:41
不懂汇编不要乱发言,等你学过汇编才知道汇编的强大远不是C可比的.
你所指的只是C在KEIL里生成的汇编代码 ...

我学习mcu是从汇编开始的,我很多项目都是用汇编做的。
使用汇编十几年后,我才开始用C做项目。
现在,假如这款mcu不支持C编译,就不会被我用于实际项目。
我(使用汇编超过25年)应该有资格说:你的知识体系有问题,汇编没你想象的那么强大。
1.直接用汇编和用C语言生成的机器语言相比,有可能是短小些,但这需要程序员花费大量的精力(精神状态还要极好)。项目简单点还好说,稍复杂些就没法做到。
2.不同MCU的汇编指令是不同的,需要花费很多精力和时间适应。
3.现在mcu速度快、ROM大。汇编相比C的那点好处已经没有任何意义。
回复

使用道具 举报

ID:624769 发表于 2022-7-4 12:35 | 显示全部楼层
xiaoyuxinke 发表于 2022-7-3 11:41
不懂汇编不要乱发言,等你学过汇编才知道汇编的强大远不是C可比的.
你所指的只是C在KEIL里生成的汇编代码 ...

是你阅读理解有问题,还是说你组词造句不过关?

撇开我懂不懂汇编先不讨论,你觉得我不懂,就当我不懂,这倒无所谓。

喷子也是需要有基础素养的,就算要喷也要对着点子喷,就算乱扣帽子,也要表面上站得住脚吧?你不能把恐龙灭绝,怪在一个侏罗纪没出生的人身上吧?

来,你给我解释一下, 哪个汇编代码是  我 “写的C生成的” ?
回复

使用道具 举报

ID:401564 发表于 2022-7-3 16:50 | 显示全部楼层
xiaoyuxinke 发表于 2022-7-3 11:41
不懂汇编不要乱发言,等你学过汇编才知道汇编的强大远不是C可比的.
你所指的只是C在KEIL里生成的汇编代码 ...

有的人总是喜欢以自己的知识水平去评价他人的水平
你怎么就知道人家不懂汇编?
你怎么就知道人家没学过汇编?
你说这话的依据是什么?
是不是以你自己的水平来分析别人所说的?
也许人家算不上高手,可汇编还是懂得的,至少汇编是学过的,至少不会像你说的这样"等你学过汇编才知道汇编的强大"
回复

使用道具 举报

ID:61140 发表于 2022-7-3 11:41 | 显示全部楼层
188610329 发表于 2022-7-1 15:49
一个 明明 只需要 MOVC A,@A+PC  就能搞定的事情, 非要在 DPTR 里面走一圈。 这已经说明了效率的低下了。
...

不懂汇编不要乱发言,等你学过汇编才知道汇编的强大远不是C可比的.
你所指的只是C在KEIL里生成的汇编代码,这个代码还是跟据你写的C生成的,这个代码好不好全在于你的C写的好不好,但并不说明如果用汇编语言也要这样写.
回复

使用道具 举报

ID:624769 发表于 2022-7-2 12:52 | 显示全部楼层
cnos 发表于 2022-7-2 08:27
如果是多个命令字符串的核对和匹配,这个MOVC A,@A+PC 就没有编码上的优势了,而且一般也不要去动用PC,SP这 ...

首先, PC指针,你还真动不了。其次,“SP 一般不要动”,和不能动 是两个概念,真的如果不能动,就像PC指针一样,你压根访问不了,玩C的话,SP确实相当于不能动,那是类似于给自己挖坑埋自己, 玩汇编的话,能玩好SP,是真的事半功倍的。
最后,在5楼的回复,主要是跟沙发说得,对于你的代码,就C本身而言,代码编译后能成这样,已经算不错了。毕竟你要C编译器,在特定场合,能通过切换 DPTR1 / DPTR0 来提高效率,或者借用PC指针,这些本身就是奢望。
回复

使用道具 举报

ID:883242 发表于 2022-7-2 09:02 | 显示全部楼层
cnos 发表于 2022-7-2 08:27
如果是多个命令字符串的核对和匹配,这个MOVC A,@A+PC 就没有编码上的优势了,而且一般也不要去动用PC,SP这 ...

没有动PC
回复

使用道具 举报

ID:688692 发表于 2022-7-2 08:27 | 显示全部楼层
如果是多个命令字符串的核对和匹配,这个MOVC A,@A+PC 就没有编码上的优势了,而且一般也不要去动用PC,SP这些敏感的寄存器。
当然汇编有汇编的玩法。
我只是说这样写出来的C代码能很方便的进行命令字符串的核对匹配,而且代码效率已经非常高了。
回复

使用道具 举报

ID:883242 发表于 2022-7-2 02:13 | 显示全部楼层
本帖最后由 Hephaestus 于 2022-7-2 08:40 编辑
cnos 发表于 2022-7-1 17:16
MOVC A,@A+PC 你这个如何指向字符串?改PC?
  1. DOS 5.0 (038-N) MCS-51 MACRO ASSEMBLER, V2.2
  2. OBJECT MODULE PLACED IN DEMO.OBJ
  3. ASSEMBLER INVOKED BY:  C:\ASM51.EXE DEMO.ASM
  4.                        

  5. LOC  OBJ            LINE     SOURCE

  6.                        1     ; ENTRY: ACC = ARRAY SUBSCRIPT
  7. 0000 2404              2         ADD  A,#(LABLE2-LABLE1)
  8.                        3     LABLE1:
  9. 0002 83                4         MOVC A,@A+PC
  10. 0003 B5990C            5         CJNE A,SBUF,LABLE3
  11.                        6     LABLE2:
  12. 0006 57484154          7         DB  'WHAT A FUCK?'
  13. 000A 20412046
  14. 000E 55434B3F
  15.                        8     LABLE3:
  16. 0012 04                9         INC A
  17.                       10         END\
复制代码

不算字符串,一共用了7个字节的代码空间,你用了11个,不过无所谓,茴香豆的茴字有几种写法并不重要,4个字节空间无所谓的。
回复

使用道具 举报

ID:329625 发表于 2022-7-1 19:29 | 显示全部楼层
指针用得好,事半功倍
回复

使用道具 举报

ID:624769 发表于 2022-7-1 17:44 | 显示全部楼层
cnos 发表于 2022-7-1 17:16
MOVC A,@A+PC 你这个如何指向字符串?改PC?

MOVC A,@A+PC
RET
DB   此处字符串

这种基本的查表格式,基本都知道吧?
回复

使用道具 举报

ID:688692 发表于 2022-7-1 17:16 | 显示全部楼层
MOVC A,@A+PC 你这个如何指向字符串?改PC?
回复

使用道具 举报

ID:624769 发表于 2022-7-1 15:49 | 显示全部楼层
一个 明明 只需要 MOVC A,@A+PC  就能搞定的事情, 非要在 DPTR 里面走一圈。 这已经说明了效率的低下了。
C 的特点,就是不在乎效率,事无巨细,都用固定的套路。
如果亲自动手打汇编代码,也是全用固定的套路,不如直接用C。没必要学汇编。
如果不能在不同情况选用最合适的方式,说明不适合学汇编。
真正能用好汇编的,这种编译器编出来的汇编代码,是看不上的。
回复

使用道具 举报

ID:624769 发表于 2022-7-1 15:42 | 显示全部楼层
看效率,不能断章取义, 你既然直接引用 SBUF 这个代码是在中断里面的吧? 你往前翻翻,看看是不是 有PUSH DPH   和 PUSH DPL   往后翻翻, 看看是不是有 POP DPH 和 POP DPL?
回复

使用道具 举报

ID:401564 发表于 2022-7-1 10:20 | 显示全部楼层
没看出这里头有什么文章来
汇编更多的优点是占用空间小,这也得是高手来写才行,有时候汇编写出来的,占用空间比C还多
回复

使用道具 举报

ID:378108 发表于 2022-6-30 18:04 | 显示全部楼层
所以,不要动不动就说C的效率比汇编低,
低是和高手的汇编比较,一般的意大利面条汇编,赶不上C的效率
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表