登录 免费注册 首页 | 行业黑名单 | 帮助
维库电子市场网
技术交流 | 电路欣赏 | 工控天地 | 数字广电 | 通信技术 | 电源技术 | 测控之家 | EMC技术 | ARM技术 | EDA技术 | PCB技术 | 嵌入式系统
驱动编程 | 集成电路 | 器件替换 | 模拟技术 | 新手园地 | 单 片 机 | DSP技术 | MCU技术 | IC 设计 | IC 产业 | CAN-bus/DeviceNe

C写多了,回来写汇编

作者:Anitya 栏目:单片机
C写多了,回来写汇编
感觉那个难啊~~~汗,缓冲区.队列的让我写半天

2楼: >>参与讨论
hotpower
想改都难
但必须了解汇编...

3楼: >>参与讨论
computer00
你说汇编在10年之内,会不会被淘汰?
 
4楼: >>参与讨论
hotpower
汇编(代码)是机器能识别的唯一“语言”
淘汰汇编容易,但淘汰编译后生成的代码难。。。



5楼: >>参与讨论
computer00
汇编代码只是助记符,我觉得已经没有必要用汇编语言来开发程序了
    机器码才识最终的代码,汇编代码要经过汇编之后才生成机器码。
    汇编语言只有那些开发编译器的人才有必要去使用。

6楼: >>参与讨论
Anitya
对于有些有特殊要求的
要么需要对C的技巧和编译器的特点有足够的了解和"耍"的能力,要么用汇编或者只能是汇编.当温习了,还好程序不怎么长.只是个测试程序.

7楼: >>参与讨论
宇宙飞船
看得出贴主的汇编还末入门!连汇编的门在哪里都不知道!
 

8楼: >>参与讨论
st_z
基本上可以这么说
   做8Bit 的东西,如果不用汇编,不去了解CPU内部构架,而想仅只通过高级语言来做好东西,或许能写得出好的程序(仅只是对程序而言)但是绝对做不出好的产品的!!!

   话说得有些偏激,但是我坚持这个观点!

9楼: >>参与讨论
宇宙飞船
贴主用的是小汇编,当然是没有架构可言了!
  目前国内的书上几乎讲的都是小汇编,根本没有架构可言。一个真正的汇编同C是没有区别的。真正的汇编高手也根本不用学C。
  汇编也就是C,C 也就是汇编。
  小伙子好好去磨练磨练,不要在这里误导初学者。

10楼: >>参与讨论
Anitya
我只同意一半
若不了解,无论是C还是汇编.根本无法下手.更别说做出东西.了解越多,做得越好.
C的高效性使人们有更多时间去了解硬件的特性,只是有没有用好的问题.
宇宙飞船的话也正是我迷茫之处,现在感觉自己C不高.汇编不就:( 所以才想慢慢通过一些小的程序,先把汇编补上.
不知道你所谓的汇编的门指什么,有多高?做到什么样我才能算及格?
高兴的是我们谈论的是MCU,而不是禅,有这么多人可以指点,要不然等到我能顿悟,不知道等到何年何月了.

11楼: >>参与讨论
hudaidai
其实也没那么玄乎
你就按照C语言函数的规则编写汇编,一般来说是个不错的起点。

通常,混合编程中汇编有两个用途:
1、和CPU密切相关的东西,如初始化建立C运行环境;
2、在效率要求特别高的地方,如部分中断服务程序(短小而经常执行的ISR用汇编可以少保存寄存器),对效率影响特别大的函数(如RTOS调度)。

汇编比较讨厌的地方是处理寄存器覆盖,使用C的规则可以使这个问题简单化(当然也可能损失了一点点效率)。

另外,尽量用可重定位的汇编,通过连接来确定代码和变量的地址。

需要优化的函数,我经常是先用C,对生成的汇编进行手工优化,效率提高最多的往往在循环上,事半功倍。另外,采用这种方式可以让你更深入了解编译器特性,有助于直接用C编写出高效率的代码。

如果编译器能像gcc那样对嵌入汇编支持得好(编译器自动进行慢速C变量到寄存器的装载,能指明破坏了哪些中间寄存器来和编译器协调),可以多采用嵌入汇编(多次使用的模块还可以inline化)。

12楼: >>参与讨论
hudaidai
补充一些
前面主要讲了混合编程中的汇编,这也是大多数项目首先推荐的方法。如果一个项目对效率要求特别高,事情又比较简单,那么可能最好的选择就是全用汇编,这时候最重要的事情就是对寄存器的使用进行预先规划,对各项任务的处理方法进行预先规划。

贴一个2000年写的软件方法捕捉4个uart信号(采样速率38400bps,最高可支持9600bd吧)的DEMO程序,当时我还没找到gcc for avr,嘿嘿。

;***************************************************************************
;* S E R I A L  P O R T S  M O N I T O R   U S I N G   T H E   A V R   MCU
;*
;* File NAME            :"main.asm"
;* Title                :Use ATMEGA103 to MONITOR a serial PORT
;* Date                 :2000.07.15
;* Version              :0.1
;* Target MCU           :ATMEGA103, 6MHZ
;*
;* DESCRIPTION
;*
;* This is a DEMO program of serial PORT MONITOR.  It can capture for serial
;* PORTs in asyn. mod(no parity check, 1 stop bit) with 1200 baud.  Further
;* more, the Disk On Chip DEVICE driver is also included.
;*
;***************************************************************************

.include "m103def.inc"

;***** GLOBAL Register Variables

.def    LSTB    =r7                     ; Last SAMPLE VALUE of the serial channels.

.def    SH0     =r8
.def    SH1     =r9
.def    SH2     =r10
.def    SH3     =r11                    ; Shift register of the serial channels.
.def    SCNT0   =r12
.def    SCNT1   =r13
.def    SCNT2   =r14
.def    SCNT3   =r15                    ; SAMPLE counter of a bit.

.def    STS0    =r16
.def    STS1    =r17
.def    STS2    =r18
.def    STS3    =r19                    ; Status register of the serial channels.

;***** Bit of the status register.
.equ    PARITY  =0                      ; Praity bit of a character.
.equ    FRMERR  =1                      ; Frame error flag.
.equ    IDLE    =2                      ; LINE idle, waiting for a start bit.
.equ    RXBT    =3                      ; Receive a new byte.

.def    AL      =r20
.def    AH      =r21                    ; Regiters used by the SAMPLE ISR.

.def    RXLEN   =r22
.def    TXEND   =r23
.def    TXNOW   =r24

.def    CMDSTS  =r25                    ; Command status.

.equ    MON0    =0                      ; MONITOR serial channel 0.
.equ    MON1    =1                      ; MONITOR serial channel 1.
.equ    MON2    =2                      ; MONITOR serial channel 2.
.equ    MON3    =3                      ; MONITOR serial channel 3.
.equ    DOC     =4                      ; Search for the DOC.
.equ    TIME    =5                      ; DISPLAY time.
.equ    STTM    =6                      ; Set time.
.equ    WAIT    =7                      ; Wait for a command.

.equ    CSCLK   =PD6
.equ    CSDOC   =PD5
.equ    RUN     =PD4

;***** Slow Variables

.dseg
MULTI:  .byte   4                       ; MULTI SAMPLE times in a bit.
cbits:  .byte   4                       ; Bit NUMBER of a character.
bcnt:   .byte   4                       ; Bit counter of a character.
dat:    .byte   4                       ; Data of the serial channels.
rxbuf:  .byte   25                      ; Receive buffer from the terminal.
txbuf:  .byte   256                     ; Transmit buffer to the terminal.

      
13楼: >>参与讨论
宇宙飞船
楼上贴的只是没有架构可言的小汇编。
 
14楼: >>参与讨论
Anitya
to 宇宙飞船
你来讲下区别?!
结构上什么不同?
何为小何为大?

拭目以待,虚心听课.

15楼: >>参与讨论
宇宙飞船
老兄,我不是教授,从不授课,只会灌水。
  hudaidai 贴的虽然基本上包含了代浮动代码的汇编指令,但是还没有形成架构。
  老兄去找一本外国大学5X86汇编的经典教材来看看就会明白的了。
除了数学函数要自已构建,市面上早有张克彦先生为AVR做好数学浮点汇编子程序了。
  能否做成一个好的架构就看您定下的目标了。如果您没有做世界一流编译器的远大理想也很难在汇编架构中有所作为!
  


16楼: >>参与讨论
hudaidai
To: 宇宙飞船
我觉得是“内容决定形式”,就我贴的汇编程序而言,工作在6M的Mega103上面,要软件完成4路串口信号的采集(支持尽可能高的波特率),另外就是人机界面的命令行处理,程序结构上比较简单,这里有几个因素决定了把程序写成这种形式:

1、为了高效,所以中断服务程序和主程序使用不同的寄存器;
2、主程序在查询方式对输入的各种命令进行响应,使用两次以上的代码极少,使用子程序只能起到提高可读性的作用,为了效率,直接把命令处理内嵌了,个人觉得利用标号、分段和注释,程序的可读性还凑合。

至于更大的项目,我当然推荐是混合编程,万一没有高级语言编译器,那也要自己模拟编译器用汇编实现模块化(可能就是宇宙飞船所说的“有架构”吧”)。

因为自己在98年设计过80C196上面的RTOS,对用户是高级语言接口,在这个过程中体会到很多,所以强烈推荐通过混合编程提高自己对汇编的认识。

后来主要在Nucleus for 68K、VxWorks for PPC这些平台上面做强实时应用,主要精力在系统分析上,对内容和形式之间的关系关注得更多。

17楼: >>参与讨论
azhe5587
To: 宇宙飞船
推荐几本好的汇编书吧,外国的更好!!谢谢!!1

18楼: >>参与讨论
宇宙飞船
真不好意思,书放在家里的藏书房的书架上,没放在身边。
   太容易得到的东西是不会去珍惜的,从网上找来一个例子,大家慢慢惨悟吧。
   请以后不要再讲出汇编会被淘汰的这样的说话了。
//*******************************************************************
; (MACRO.ASM) Example program to show how to use macros (adg).

    MLIST    ON    ; show macro expansions in listing
    
DATA    EQU    $4000    ; start of MEMORY desired for data storage
CODE    EQU    $6000    ; start of MEMORY desired for code storage

ADDER    MACRO
    LDAA    \1    ; load from first location
    ADDA    \2    ; add in from second location
    STAA    \3    ; store to third location
    ENDM

    ORG    DATA
NUM1    DC.B    $10    ; allocate first location, init. to $10
NUM2    DC.B    $20    ; allocate second location, init. to $20
NUM3    DS.B    1    ; allocate third location
    
    ORG    CODE
    ADDER    NUM1,NUM2,NUM3    ; (NUM3)<-(NUM1)+(NUM2)
    BGND



19楼: >>参与讨论
gxz207gxz
我想不会的
 
20楼: >>参与讨论
微言小蚁
汇编怎么可能会被淘汰?
汇编怎么可能会被淘汰,大树再高,也得把根扎到土里!只是应用范围小而已!

21楼: >>参与讨论
waerwu
不会
汇编语言不会被淘汰,特别是小系统中,直接驱动硬件的系统中,汇编很实用啊,各位老兄,汇编真的很实用,要多加了解!

22楼: >>参与讨论
cnchip
呵呵,又要吵起来了!
汇编与C从N年前一直争论到现在,估计还要持续到N年后……

23楼: >>参与讨论
Anitya
我的本意并不是这样
发个帖子来争论谁会被谁淘汰之类的并非我本意.
C是好用,所以我常用C来写程序,但是C也有其力所不能及的地方,所以我才会"逼迫"自己回来也写写汇编程序,使自己不至于太生疏:$


24楼: >>参与讨论
edmond1000
我还要考汇编咧
 
25楼: >>参与讨论
沧海一笑
搞开发,汇编还是要懂的好,除非你是玩玩!
 
26楼: >>参与讨论
dfox
汇编我能用到的最底层的语言了
 
27楼: >>参与讨论
douzy2008
汇编有汇编的好处,是高级语言不可替代的。
汇编直接面向底层,写起来虽然麻烦,但对做什么,怎样做,用了什么资源,心中很明白。对实时性要求高的操作比较有保证。多积累一些子程序模块,就会更方便。

28楼: >>参与讨论
zps2001
当然不会
真正的计算机高手都必须懂汇编,而且没有一个黑客会说自己不懂汇编,所以汇编不会被淘汰,它的地位是其他语言都不可取代的。

29楼: >>参与讨论
shenhaibo
用移位寄存器可以实现吗
 
30楼: >>参与讨论
renmingcan
汇编想说爱你不是件容易的事情!
汇编语言其实很好的

31楼: >>参与讨论
呵呵
怎么说呢,我们汇编老师就是搞汇编出身的,人家有上亿资产,在我们学习汇编前他就对我们说汇编不会被淘汰,所以我还是很相信他的.
参与讨论
昵称:
讨论内容:
 
 
相关帖子
我在仿真时发送的数据时乱码,而且一直不停的发送
求助:怎么用外部电路修改Mega16的熔丝位(大侠帮忙,很着急)
MEGA128与MEGA64引脚和外围器件完全兼容吗?
使用AVR studio
对<AVR 单片机GCC 程序设计>中bootloader功能应用中的不理解地方
免费注册为维库电子开发网会员,参与电子工程师社区讨论,点此进入


Copyright © 1998-2006 www.dzsc.com 浙ICP证030469号