色偷偷偷久久伊人大杳蕉,色爽交视频免费观看,欧美扒开腿做爽爽爽a片,欧美孕交alscan巨交xxx,日日碰狠狠躁久久躁蜜桃

x
x
查看: 6089|回復(fù): 4
打印 上一主題 下一主題

HotC51共產(chǎn)兒童團(tuán)第十二課:匯編是藝術(shù)是享受,而非技巧可以攀比

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
發(fā)表于 2009-4-2 22:40:14 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
關(guān)鍵詞: 兒童團(tuán) , 匯編 , 技巧 , 攀比 , 藝術(shù)
HotC51 發(fā)表于 2009-3-3 22:28 裸奔式實(shí)時(shí)操作系統(tǒng)HotTask51 ←返回版面

樓主: HotC51共產(chǎn)兒童團(tuán)第十二課:匯編是藝術(shù)是享受,而非技巧可以攀比


開(kāi)課:
菜農(nóng)“逆潮流”而創(chuàng)辦的“HotC51共產(chǎn)兒童團(tuán)”就是要讓更多的“紅色腦漿”
流淌在地球的各個(gè)角落,讓更多的“團(tuán)員”和那些自認(rèn)為“老大”的PK~~~
菜農(nóng)就是要培養(yǎng)千千萬(wàn)萬(wàn)的“混小子”、“二愣子”和“天不怕、地不怕”的
“小菜農(nóng)”~~~
只要他舉起紅旗,他就不怕任何地球人~~~
A人(擅長(zhǎng)匯編之人)和C人(擅長(zhǎng)高級(jí)語(yǔ)言之人)本無(wú)貧賤之分,更無(wú)高低之別。
就菜農(nóng)個(gè)人而言,可謂學(xué)盡了天下的各種計(jì)算機(jī)語(yǔ)言~~~至少在MCU這個(gè)
圈子里俺可以這么說(shuō)~~~
至少俺敢說(shuō)單片機(jī)并非俺之最強(qiáng)項(xiàng)~~~
但俺所編的每一句匯編語(yǔ)言自己都要“審美”一遍,直到“陶醉”為止~~
這是很多人不能理解的~~~
若有人說(shuō)俺匯編“檔次地”,俺可以“高點(diǎn)”,但俺絕不會(huì)單獨(dú)用C語(yǔ)言!
為什么???若C語(yǔ)言是“最高境界”,那么Delphi、BC、CVI、VC、VB
Java、C#、VB.Net等為什么要再“造”呢???
匯編是一切語(yǔ)言之母。!不會(huì)匯編的C語(yǔ)言“高手”永遠(yuǎn)都是自己封的
“高手”~~~編譯器的任何小bug都會(huì)雷翻他~~~
高級(jí)語(yǔ)言一個(gè)問(wèn)題可能有多種編程方法,但匯編可能又有一個(gè)唯一之解。
有時(shí)是無(wú)法“PK”的~~~

舉例:
天雨粟 發(fā)表于 2008-10-19 14:59 侃單片機(jī) ←返回版面 舉報(bào)該貼

一個(gè)精巧的兩字節(jié)除法子程序

條件:8個(gè)unsigned char型數(shù)據(jù)相加,高位在R2中,低位在R3中
出口:將此數(shù)除以8,余數(shù)四舍五入

MOV    A,R2        ;(R2,R3)/8
SWAP    A
RL    A
XCH    A,R3
SWAP    A
RL    A
ADD    A,#80H        ;四舍五入
ANL    A,#1FH
ADDC    A,R3
RET                    ;結(jié)果在A中

下面是具體分析:由于被操作數(shù)是8個(gè)無(wú)符號(hào)字符型數(shù)據(jù)相加,固其高位(R2)里D3位及其以上必為0。
現(xiàn)在將其分為三部分別想辦法:R2的低四位,R3的高四位,R3的低四位。

將R2的低四位換到高四位,相當(dāng)于把低四位乘以16,左移一位,又相當(dāng)于乘以2,則原數(shù)被乘以了32。R2的真實(shí)意義是(R2)*256,現(xiàn)在我們將其看作一個(gè)普通的單字節(jié)數(shù),則相當(dāng)于將其除以了256。先乘以32再除以256,則等于將原數(shù)除以8。

將R3的高四位移到低四位,完成除以16,左移一位,相當(dāng)于乘以2,最終完成除以8。

R3的低四位,其中的D3位,其權(quán)值正好為8,通過(guò)左移,移到新數(shù)的D0位(形成商加1——D3=1時(shí);或不加——D3=0時(shí))。R3的D2~D0位是余數(shù),如為4~7時(shí)要五入;如為0~3時(shí)要四舍。分析可知,當(dāng)D2為1時(shí),余數(shù)為4~7;D2為0時(shí),余數(shù)為0~3。在對(duì)R3進(jìn)行左移操作時(shí),D2已移到最高位,現(xiàn)對(duì)移位的結(jié)果加#80H,D2為1時(shí),必置位CY,通過(guò)ADDC指令加進(jìn)位形成五入,否則四舍。
ANL A,#1FH,因?yàn)镽3/8,商的有效位為D4~D0,其它位在運(yùn)算時(shí)要使用,但取結(jié)果時(shí)必須屏蔽掉。


俺隨手即拋出一個(gè)“終極PK”,是人無(wú)法逾越~~~或很難逾越。
不算“精巧”吧~~~俺這個(gè)要少3條語(yǔ)句~~~[/B]
hotpower 發(fā)表于 2008-10-19 17:12 侃單片機(jī) ←返回版面 舉報(bào)該貼

;R2=00000YYY R3=xxxxxXXX
MOV  A,R3;xxxxxXXX
ADD  A,#4;XXX+4 四舍五入(CY)
ANL  A,#0F8H;xxxxx000
ADDC A,R2;xxxxxYYY+CY
SWAP A;xyyyxxxx
RL   A;yyyxxxxx
RET;結(jié)果在A中yyyxxxxx

現(xiàn)在也可以有人來(lái)“PK”~~~
在菜農(nóng)發(fā)布近6000多行的“匯編數(shù)組”前,讓俺自己先“陶醉”一下~~~
至于什么是“匯編數(shù)組”?它和匯編語(yǔ)言、嵌入?yún)R編、腳本語(yǔ)言等有何區(qū)別?
“匯編數(shù)組”的過(guò)去、現(xiàn)在和將來(lái),這要在團(tuán)課中做專(zhuān)題才能說(shuō)清楚。
先陶醉“匯編數(shù)組”Demo包里的一個(gè)經(jīng)典的匯編例程---軟件中斷。
HotC51 發(fā)表于 2009-3-3 18:42 侃單片機(jī) ←返回版面

3樓: main.c

#include "hottask51.h"

void TimerISR2() interrupt TF2_VECTOR using 3
{
    TF2 = 0;
    _nop_();
    _nop_();
    _nop_();
}

void UserISR0f() interrupt 0x0f using 3
{
    _nop_();
    _nop_();
    _nop_();
}

void UserISR1f() interrupt 0x1F using 3
{//所有非法軟中斷被攔截到此~~~
    _nop_();
    _nop_();
    _nop_();
}


void main()
{
    comFunction.Vtbl.STARTex();

    comFunction.Vtbl.START();
    comFunction.Vtbl.ISR(TF2_VECTOR);//軟中斷到Timer2Isr()
    comFunction.Vtbl.ISR(0x1f);//軟中斷0x1f
    comFunction.Vtbl.ISR(0x20);//非法軟中斷被攔截到0x0f
    comFunction.Vtbl.ISR(0x30);//非法軟中斷被攔截到0x0f
    comFunction.Vtbl.ISR(0x40);//非法軟中斷被攔截到0x0f
    comFunction.Vtbl.ISR(0x50);//非法軟中斷被攔截到0x0f
    comFunction.Vtbl.ISR(0x60);//非法軟中斷被攔截到0x0f
    comFunction.Vtbl.ISR(0x70);//非法軟中斷被攔截到0x0f
    comFunction.Vtbl.ISR(0x80);//非法軟中斷被攔截到0x0f
    comFunction.Vtbl.ISR(0x90);//非法軟中斷被攔截到0x0f
    comFunction.Vtbl.ISR(0xa0);//非法軟中斷被攔截到0x0f
    comFunction.Vtbl.ISR(0xb0);//非法軟中斷被攔截到0x0f
    comFunction.Vtbl.ISR(0xc0);//非法軟中斷被攔截到0x0f
    comFunction.Vtbl.ISR(0xd0);//非法軟中斷被攔截到0x0f
    comFunction.Vtbl.ISR(0xe0);//非法軟中斷被攔截到0x0f
    comFunction.Vtbl.ISR(0xff);//非法軟中斷被攔截到0x0f

    comFunction.Vtbl.TEST();
    comFunction.Vtbl.RESET();//軟件復(fù)位
    while(1);//永遠(yuǎn)不能執(zhí)行!!!
}


哈哈~~~估計(jì)有很多C高人一生用過(guò)的C51中斷函數(shù)也不超過(guò)5個(gè)吧~~~
咱們“HotC51共產(chǎn)兒童團(tuán)”的團(tuán)員們以后都用滿32個(gè)氣暈他們~~~
現(xiàn)在來(lái)陶醉吧~~~
HotC51 發(fā)表于 2009-3-3 18:39 侃單片機(jī) ←返回版面

樓主: 菜農(nóng)正式發(fā)布“匯編數(shù)組”完整版前再暈大家一次(不暈做中隊(duì)長(zhǎng))

/*---------------------------------------------
    HotTask51軟中斷函數(shù)
    void __HotASM_ISR__(unsigned char isrNum)
入口: R7   D4D3 中斷向量組號(hào)  D2D1D0 中斷向量號(hào)
出口: R7   isrNum
結(jié)果: 跳入對(duì)應(yīng)的中斷地址 isrNum * 8 + 3
-----------------------------------------------*/
HotASM (__HotASM_ISR__)//(unsigned char isrNum)
{//DPTR保存的是匯編數(shù)組函數(shù)的首地址__HotASM_ISR__
#define lable__HotASM_ISR__Error (-(size_CPL_C() + size_MOV_A() + size_JNC()))
    asm_CJNE_R7(0x20, size_CPL_C() +size_MOV_A() - 1),//mov a,R7
//lable__HotASM_ISR__Error:
    asm_CPL_C(),
    asm_MOV_A(0xEF),//mov a,0xef//
    asm_JNC(lable__HotASM_ISR__Error),//非法軟中斷號(hào)>(0~0x1f)
    asm_RL_A(),
    asm_RL_A(),
    asm_RL_A(),
    asm_ORL_A(0x03),
    asm_CLR_ACC_2(),
    asm_PUSH_ACC(),//壓入中斷地址低8位
    asm_CLR_A(),
    asm_PUSH_ACC(),//壓入中斷地址高8位
    asm_RET()//跳入對(duì)應(yīng)的中斷地址 isrNum * 8 + 3
};


菜農(nóng)一句一句地“陶醉”:
在51中,中斷向量一個(gè)有4組,每組8個(gè),共32個(gè)。
每個(gè)中斷向量地址的公式為: N*8 +3. 其中:N=0~31
在Regx52.h頭文件里,有幾個(gè)定義:
/*------------------------------------------------
Interrupt Vectors:
Interrupt Address = (Number * 8) + 3
------------------------------------------------*/
#define IE0_VECTOR 0  /* 0x03 External Interrupt 0 */
#define TF0_VECTOR 1  /* 0x0B Timer 0 */
#define IE1_VECTOR 2  /* 0x13 External Interrupt 1 */
#define TF1_VECTOR 3  /* 0x1B Timer 1 */
#define SIO_VECTOR 4  /* 0x23 Serial port */
#define TF2_VECTOR 5  /* 0x2B Timer 2 */
#define EX2_VECTOR 5  /* 0x2B External Interrupt 2 */

這些都可以由硬件觸發(fā)的中斷,其他都是無(wú)對(duì)應(yīng)硬件中斷而“保留的”軟件中斷。
他們必須由軟件來(lái)觸發(fā)即調(diào)用。
故必須編寫(xiě)一個(gè)“軟中斷函數(shù)”,這在ARM/DSP上都是芯片自帶的,而51必須自己
編寫(xiě),效率肯定不如硬件中斷觸發(fā)的高。
既然是軟件中斷,即為擴(kuò)展中斷,那么可能就會(huì)有不存在的軟件中斷。
這一般有2中:其一為越界的中斷(>0x1f),界內(nèi)但未聲明的中斷(以后團(tuán)課講)
HotTask51軟中斷函數(shù)例程有幾個(gè)“精華”之處:
1.越界的中斷(>0x1f)的判別:
入口向量號(hào)在R7寄存器中
      cjne r7,#0x20,next-1//實(shí)際跳入mov a,r7,這句是“反逆向技術(shù)”
//r7=0x20在此入口
err:
      cpl c//因?yàn)閏jne語(yǔ)句用jnc判斷即>=判斷,故R7>=0x70時(shí)CY=0,此語(yǔ)句是欺騙敵人
      mov a,#0xef;上句實(shí)際應(yīng)該setb c.主要為了通過(guò)下句的封鎖。
next:
      jnc err//r7>0x20在此回跳!進(jìn)行錯(cuò)誤攔截!在菜農(nóng)的OS中為狗任務(wù)
//以下做N*8+3運(yùn)算
rl a
rl a
rl a//N*8
orl #0x03//N*8+3
clr acc.2//去掉非法中斷向量中被攔截到0x0f后的錯(cuò)誤,因?yàn)?xef會(huì)得到0x0f*8+7的錯(cuò)誤
//下面是A人最經(jīng)典的“跳轉(zhuǎn)”,它令人陶醉地模擬了LCALL過(guò)程~~~
push acc//壓入中斷地址低8位
clr a//因?yàn)?x1f*8+3不可能超過(guò)0x100,即高位地址恒為0
push acc//壓入中斷地址高8位
ret//跳入對(duì)應(yīng)的中斷地址 isrNum * 8 + 3

到此,一個(gè)精妙的A人編程的思路講解完畢。
最后注意“匯編數(shù)組”是動(dòng)態(tài)編譯指令,而匯編和嵌入?yún)R編是靜態(tài)編譯指令。
要說(shuō)“檔次”肯定不能在一起PK的~~~
“匯編數(shù)組”若是在RAM運(yùn)行的話,可以向PC的動(dòng)態(tài)鏈接庫(kù)DLL一樣~~~
課畢:
HotC51@126.com   2009.3.3于菜地。
團(tuán)部:http://group.ednchina.com/1623/
沙發(fā)
發(fā)表于 2009-6-12 13:23:30 | 只看該作者
我原來(lái)用匯編,現(xiàn)在很少用了,最多c和匯編結(jié)合起來(lái)用
板凳
發(fā)表于 2009-6-16 15:22:21 | 只看該作者
不懂啊只能看熱鬧
地板
發(fā)表于 2010-7-15 22:44:53 | 只看該作者
不懂C 只懂一點(diǎn)匯編 湊個(gè)熱鬧
地下室
發(fā)表于 2010-7-28 21:17:48 | 只看該作者
好, 菜農(nóng)加油啊

本版積分規(guī)則

關(guān)于我們  -  服務(wù)條款  -  使用指南  -  站點(diǎn)地圖  -  友情鏈接  -  聯(lián)系我們
電子工程網(wǎng) © 版權(quán)所有   京ICP備16069177號(hào) | 京公網(wǎng)安備11010502021702
快速回復(fù) 返回頂部 返回列表