第5章 汇编语言程序设计_第1页
第5章 汇编语言程序设计_第2页
第5章 汇编语言程序设计_第3页
第5章 汇编语言程序设计_第4页
第5章 汇编语言程序设计_第5页
已阅读5页,还剩37页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、第五章 汇编语言程序设计1第五章 汇编语言程序设计 5-1 5-1 汇编语言程序设计基础汇编语言程序设计基础 5-2 5-2 常用汇编伪指令常用汇编伪指令5-3 5-3 宏定义宏定义5-4 5-4 汇编程序设计举例汇编程序设计举例内容提要内容提要: :第五章 汇编语言程序设计2标号(标号(LABEL) 操作码(操作码(OPCODE) 操作数(操作数(OPERAND) 注释注释(COMMENTS) 语句标号应以英文字母开头,可以包含字母、数字和下划线。标号后面加冒号“:”表示的是当前语句的地址。以“*”开头表示该行为注解行,不参与编译。 操作码表示指令代码,为指令助记符。操作数描述指令的寻址方式

2、和相关的参数。第一个操作数和操作码之间用空格分开,后面的操作数与前面的操作数用逗号“,”分开。 注释有助于编程人员或读者看懂程序,因此要养成写注释的好习惯。通常的汇编器都要求以分号“;”开头。正确的注释方法不是对每行的翻译,而是对几行或一段程序的功能和使用方法进行说明。 5-1 汇编语言程序设计基础汇编语言格式汇编语言格式第五章 汇编语言程序设计3常量的表示常量的表示 十进制整数(decimal),由0 9的数字序列组成。例如,100,256,1024。 十六进制整数(hexadecimal),由“$”符号后面加0 9、A F组成。例如,$05,$EF,$FFA5。 八进制整数(octal),

3、由“”后面跟0 7的数字组成。例如,55,1000,2000。 二进制整数(binary),由“”后面跟0或1的数字序列组成。例如,101,00101101。 字符串常量(String),是由单引号()或双引号(“”)引起来的可打印字符组成。若字符串的内容包含单引号,则该字符串只能用双引号表示。若字符串内容包含双引号,则该字符串只能用单引号表示。例如,ABCD, “ABCD”, A, “B”, A“B, “AB”。 第五章 汇编语言程序设计41. ORG指令指令读作Original,通知编译器从某地址定位代码。例如,ORG$4000 ;通知编译器从$4000地址开始定位下面的代码。2. EQU

4、指令指令格式为 :EQU该指令表示标号与表达式等价。表达式不可以是没有定义或后面定义的符号。例如,MaxElement:EQU 20;最大元素数20 MaxSize:EQUMaxElement*4;最大占用空间80 5-2 常用汇编伪指令第五章 汇编语言程序设计53. SET指令指令SET指令与EQU指令类似同样用来定义标号和常量的关系,但是SET指令定义的常量后面还可以使用SET指令重新赋值。例如,Count:SET1 One:DC.B Count Count:SET2 Two:DC.B Count经过以上定义后,常量One的值为1,常量Two的值为2。第五章 汇编语言程序设计64. DC指

5、令指令DC(Define Constant)指令用于定义常量。语法如下:DC . , 其中size可以是B(默认)、D、L,分别表示1个字节、2个字节、4个字节。与该指令同义的还有以下几条指令:FCB等价于DC.B,FDB、DCW等价于DC.W,FQB、DCL等价于DC.L举例说明:Somedata: DC.B 0101,12,10,$10String1:DC.B $A,$B,$C,$DString2:DC.W $A,$B,$C,$DString3:DC.L $A,$B,$C,$D第五章 汇编语言程序设计75. FCC指令指令定义字符串可以使用FCC指令,其效果和DC.B相同。例如,Strin

6、g:FCCABCD从String开始的数据单元的内容依次为ABCD的ASCII码,即$41 $42 $43 $44。6. DCB指令指令DCB(Define Constant Block)用于定义常量块。使用该指令可以方便的将某段内存空间初始化为某个固定的数值。语法如下:DCB .,其中size可以是B(默认)、D、L,分别表示1个字节、2个字节、4个字节。下面举例说明。Label1:DCB.B 10,$00Label2:DCB.L 10,$FFFFFFFF将Label1开始的10个字节全部清零,将Label2开始的10个4字节空间全部初始化为$FFFFFFFF。第五章 汇编语言程序设计87.

7、 DS指令指令DS(Define Space)指令用于为变量预留内存空间。该指令语法如下:DS.其中size可以是B(默认)、D、L,分别表示1个字节、2个字节、4个字节。另有几条指令与该指令等价:RMB等价于DS.B,RMD等价于DS.W,RMQ等价于DS.L下面举例说明该指令的用法。A:RMB 1B:RMD 1C:RMD 2以上伪指令相当于分别定义了3个变量他们的数据宽度分别是1个字节,2个字节和4个字节。第五章 汇编语言程序设计98. ABSENTRY指令指令该指令用于定义程序的入口点。语法为ABSENTRY。举例如下,ABSENTRY entry ORG $FFFE Reset:DC.

8、W entry ORG $70 entry:NOP NOP main: LDS #$1FFF NOP BRA main 9. XDEF指令指令定义外部变量,相当于C语言中的GLOBAL、PUBLIC,表示定义的变量可以在其它模块或文件中引用。例如:XDEFSCI_GET_CHAR表示SCI_GET_CHAR这个子程序是可以被其它的C程序或外部模块调用的。此处编译器是对大小写敏感的。第五章 汇编语言程序设计1010. XREF指令指令声明外部模块,表示此处声明的模块是在其它模块中定义的。例如:XREF SCI_GET_CHAR11. END指令指令END指令通知编译器后面的内容忽略。因此写在EN

9、D后面的指令将不会被编译,也不会生成相应的机器码。 第五章 汇编语言程序设计1112. SECTION指令指令格式为 :SECTIONSHORT SECTION指令用来声明可以重定位的段信息,指定某一段是代码还是数据等,放于什么位置。相同的名字的段代表相同的段,后面出现的同名段中的内容将被排放在前一个同名段的最后一条语句或指令之后。SHORT指明本段可以使用直接寻址模式(DIR)。是为了与MASM兼容的可选参数。代码段(code SECTION)至少要包含一条汇编指令,只包含DC、DCB的段则是常量段(constant SECTION),包含DS或空的段是数据段(data SECTION)。如

10、果一个段中包含DC和DS或汇编语句,这样的段不是数据段,默认会被定位在ROM中。 第五章 汇编语言程序设计12例如: aaa:SECTION NOPSTOP bbb:SECTIONPSHAPULARTS aaa:SECTIONINCA汇编程序会将后面一个aaa段的INCA指令放在前一个aaa段的STOP指令之后,它们是同一个段。 第五章 汇编语言程序设计13编译程序会将引用宏的地方用宏定义的内容去取代。宏必须在它被引用之前定义,定义的时候也可以包含已经定义的宏,但不可以嵌套定义。MACRO,ENDM其中MACRO、ENDM是关键字,占位符用反斜杠后面跟数字0 9或大写字母A Z表示。0占位符是

11、表示数据宽度的,通常前面加点.。下面举个例子:MyMacro:MACRODC.0 1,2ENDM在程序中引用的格式如下:MyMacro.B$40,$20编译后的结果如下:DC.B$40,$20 5-3 宏定义第五章 汇编语言程序设计14例例1. 多字节无符号数加法,加数分别放在add1,add2开始的数据单元,高位低地址,低位高地址。结果放在sum开始的单元中。ORG $1000add1: FCB$01,$02,$03,$04,$05,$06,$07,$08;第一个加数add2: FCB$11,$12,$13,$14,$15,$16,$17,$18;第二个加数sum: DS.B 9;和ORG

12、$4000LDX#add1+7;X指向第一个加数的最低位LDY#add2+7;Y指向第二个加数的最低位LDAB #8;设置循环计数器,共8个字节CLC;清进位位C5-4 汇编程序设计举例第五章 汇编语言程序设计15LOOP1: LDAA1,X-;取第一加数一个字节 ADCA1,Y-;加上第二加数的对应字节,加进位位C STAA 10,Y;存到结果单元 DBNEB,LOOP1;未完继续 BCCOVER ;最高位相加后无进位,转到OVER LDAA #1;否则最高位加1 STAA 9,YOVER: BRA *;结束执行完后,sum开始的数据单元的结果为$00 $12 $14 $16 $18 $1C

13、 $1E $20 第五章 汇编语言程序设计16例例2. 多字节无符号减法,被减数和减数分别放在sub1和sub2开始的数据单元,结果放在rst开始的单元,结果的第一个字节为符号位$00表示结果为正,$01表示结果为负。ORG $1000sub1:FCB$01,$02,$03,$04,$05,$06,$07,$08;被减数sub2:FCB$11,$12,$13,$14,$15,$16,$17,$18;减数rst: FCB $00,$00,$00,$00,$00,$00,$00,$00,$00;差 ORG $4000LDS#rst+8 ;SP指向差的最低位LDX#sub1+7;X指向被减数的最低位

14、LDY#sub2+7;Y指向减数的最低位LDAB #8;设置循环计数器,共8个字节CLC;清进位位C第五章 汇编语言程序设计17LOOP1: LDAA1,X-;取被减数一个字节 SBCA 1,Y-;减去减数对应的字节和进位位STAA 1,SP-;差存到结果单元DBNE B,LOOP1;未完继续BCCOVER ;最后没有借位,则结束MOVB#$01,SP;有借位,则将结果最高位单元置1表示结果为负;进一步处理OVER: BRA *;结束 第五章 汇编语言程序设计18例例3. 多字节压缩BCD码减法,BCD码的减法,需先对减数求以10为模的补码,即用$9A减去减数,然后用被减数和减数的补码相加,再

15、做二十进制调整,即可得到差。但是对于多字节的减法,还要注意正确的借位,由于用DAA指令进行了调整,实际上当C0时是有进位的,C1时无进位,所以在进行下一个字节的运算之前要先对进位位做一下处理。当被减数比减数小的时候,得出的结果同样是不正确的。需根据符号位,重新用减数减去被减数得到两者差的绝对值,再配合符号位,即可得正确结果。第五章 汇编语言程序设计19 ORG $1000minuend:FDB$2567,$5536,$2407;被减数subtrahend:FDB$2568,$0126,$2508;减数difference:FDB$0000,$0000,$0000;差sign:FCB$00;0表

16、示结果为正,1表示结果为负cnt:FCB$06;循环计数器 ORG $4000 LDS #minuend+5;SP指向被减数最低字节 LDX #subtrahend+5;X指向减数最低字节 LDY #difference+5 ;Y指向差的最低位字节 LDABcnt;B做循环计数器 CLC;清除进位位C LOOP1: LDAA#$9A ; SBCA1,X-;求减数的补码 ADDA1,SP-;与被减数相加 DAA ;二十进制调整第五章 汇编语言程序设计20STAA 1,Y-;保存结果BCCLBL1;调整进位,即对进位位取反BCSLBL2;LBL1: SEC;设置进位位为1BRALOOP2;LBL2

17、: CLC;调整进位到此结束LOOP2:DBNEB,LOOP1;未完继续BCCOVER;如果结果为正结束MOVB#1,sign;结果为负,置符号位LDS#subtrahend+5;取减数地址放到SPLDX#minuend+5;被减数地址放到XLDY#difference+5 ;Y指向差LDAB cnt;用B循环计数CLC;清进位位CBRALOOP1;跳转到LOOP1处,用减数被减数 ;再做一遍OVER:BRA *;结束第五章 汇编语言程序设计21例例4. 多字节无符号数乘以单字节无符号数乘法,被乘数和乘数分别放在mul1、mul2开始的数据单元中,结果存放在rst开始的数据单元中。而多字节有符

18、号数的乘法可以转化成无符号数的乘法进行运算。 ORG $1000mul1: FCB$01,$02,$03,$04,$05,$06,$F5,$F5;被乘数mul2: FCB$50;乘数rst: FCB$00,$00,$00,$00,$00,$00,$00,$00,$00;积 ORG $4000 LDS#rst+8 ;SP指向结果的最低位字节 LDX#mul1+7;X指向被乘数的低位 LDY#8;设置循环计数器,共8个字节 CLC ;清进位位C 第五章 汇编语言程序设计22LOOP1: LDAA1,X-;取被乘数一个字节放在A中 LDABmul2;乘数放在B中 MUL;相乘结果在(A:B)中 AD

19、DBSP;将B与结果单元相加,和在B中 STAB1,SP-;将B存到结果单元,并将指针指向高一位的 ;字节 ADCASP;将A与结果单元相加,和在A中 STAASP;将A存到结果单元 DBNEY,LOOP1;未完到LOOP1处继续执行 BRA *;结束本例计算结果为$00 $50 $A0 $F1 $41 $92 $2C $DC $90存于rst开始的单元中。 第五章 汇编语言程序设计23例例5. 多字节无符号数乘以16位无符号数乘法,被乘数和乘数分别放在mul1、mul2开始的数据单元中,cnt中存放被乘数的字数即循环次数,结果存放在rst开始的数据单元中。对于有符号数的运算可以采用先确定符号

20、再转化成无符号的乘法运算。ORG $1000mul1: FDB$1123,$0034,$56FE,$CD45;被乘数mul2: FDB$5023;乘数rst: FDB$0000,$0000,$0000,$0000,$0000;积cnt: FDB$0004;被乘数字数,即循环次数 ORG $4000 LDS#rst+8 ;SP指向结果的最低字 LDX#mul1+6;X指向被乘数的最低字 LDYcnt;设置循环计数器 CLC;清进位位C第五章 汇编语言程序设计24LOOP1:STY cnt;保存循环计数值 LDD2,X-;取被乘数一个字放在D中 LDYmul2;取乘数放在Y中 EMUL;相乘,结果

21、在Y:D中 ADDD SP; STD2,SP-;结果低位字加到结果单元 TFRY,D; ADCB #$00;加进位位C ADDD SP; STDSP;结果高位字加到结果单元 LDYcnt;将循环计数器当前值放到Y中 DBNE Y,LOOP1;Y减1不为0,则到LOOP1处继续执行OVER:BRA *;结束本例计算结果为$055D $47D9 $6257 $84FB $A06F存于rst开始的单元中。 第五章 汇编语言程序设计25例例6. 多字节无符号数除以16位无符号数除法,被除数、除数、商、余数分别放在放在dividend、divisor、quotient、remainder开始的数据单元,

22、其中被除数最高字节单元必须为为$0000,被除数的数据长度放在cnt单元,用于循环计数,ptrTemp单元用来保存运算过程中商指针的位置。 ORG $1000dividend:FDB $0000,$5536,$2407,$9958,$EE21;被除数divisor:FDB$0033 ;除数quotient:FDB$0000,$0000,$0000,$0000;商remainder:FDB$0000;余数cnt:FDB$0005;计数,即被除数所占字数ptrTemp:RMB 2;用于临时保存商的指针 第五章 汇编语言程序设计26 ORG $4000 LDS#dividend;SP指向被除数的最高

23、字 LDY 2,SP+;取出被除数最高字放到Y中,SP指向下一个字 LDX #quotient;X指向商的最高字位置 STXptrTemp;保存指针 LDX cnt;取X做循环计数 DEX;X减1,只需做X-1次循环就够了LOOP1: STX cnt;将循环计数器值保存到cnt单元 LDXdivisor ;X中放除数 LDD2,SP+ ;D中放被除数低位字 EDIV;(Y:D)(X) Y ;余数 D LDXptrTemp;X指向商的位置 STY2,X+;保存商,指针指向商的下一位 STXptrTemp;保存商指针第五章 汇编语言程序设计27 TFRD,Y;余数放到Y中,准备下一次除法 LDXc

24、nt;循环计数值放到X中 DBNEX,LOOP1;X减1不为0则到LOOP1处循环执行 STYremainder;除完,将余数保存到remainder单元OVER:BRA *;结束本例的运算结果商为$01AB $BA6E $9493 $4FF6,余数为$001F。 第五章 汇编语言程序设计28例例7. 将TBL处的一串数据按照从高地址到低地址从小到大排序。cnt1、cnt2分别用作冒泡排序中的两层循环计数,TEMP作为交换时的临时存储单元。ORG $2000TBL:FDB $F50,$872,$E48,$485,$F78,$B71,$A83,$795,$924,$372;数据cnt1:RMB

25、1;计数器1cnt2:RMB 1;计数器2TEMP:RMB 2;交换单元 ORG $4000MOVB #9,cnt1;外层循环计数LOOP1:MOVB #9,cnt2;内层循环计数LDX #TBL;X指向数据表首地址LOOP2:LDD X;取一个数CPD 2,X;与下一个数比较BLS CHG;小于等于则转CHG处交换第五章 汇编语言程序设计29JMP NEXT;否则,进行下一个数比较CHG: STD TEMP;LDD 2,X ;STD X;LDD TEMP;STD 2,X;两数交换NEXT:INX;INX;X增2,指向下一个数据DEC cnt2;内层减1BNE LOOP2;不为0转到LOOP2

26、处继续DEC cnt1;否则,外层减1BNE LOOP1;不为0转到LOOP1处循环BRA *;结束 第五章 汇编语言程序设计30例8. 将两组数据,$0001,$0002,$0003,$0004,$0005,$0006,$0007,$0008和$0011,$0012,$0013,$0014,$0015,$0016,$0017,$0018分别存放于SRC1和SRC2开始的RAM单元中。要求计算:Sum($0001$0011)+($0002$0012)+ +($0008$0018)。并将结果存放在DEST开始的RAM单元中。ORG$2000SRC1:FDB$01,$02,$03,$04,$05,

27、$06,$07,$08;第一组乘数SRC2:FDB$11,$12,$13,$14,$15,$16,$17,$18;第二组乘数DEST:RMB4;存放结果ORG$4000 LDX #DEST;X指向结果单元 MOVW #0, 2, X+;结果单元高位字清0 MOVW #0, X;结果单元低位字清0 第五章 汇编语言程序设计31LDX#SRC1;X指向第一组操作数LDY#SRC2;Y指向第二组操作数LDAB#8;循环计数器,共8对数据LOOP1: EMACSDEST;乘积并累加到DEST单元BVSERR;检查溢出,是则转到ERR处处理LEAX2,X;X指向下一个操作数LEAY2,Y;Y指向下一个操

28、作数DBNEB,LOOP1;未完则转到LOOP1继续执行ANDCC#$FE;清除进位位C,表示正常结束无溢出ERR:ORCC#$01;将进位位C置位,表示溢出BRA *;溢出返回运算结束后DEST开始的内存单元为$0000030C。第五章 汇编语言程序设计32例9.在RAM地址$1000开始的10个单元里,分别存放10个无符号字节型数据,要求使用汇编语言编写一段程序,把10个数据按照从小到大的顺序排序。冒泡排序原理:冒泡排序原理: 若要排序的数有n个,则需要n-1轮排序,第i轮排序中,从第一个数 开始,相邻两数比较,若不符合所要求的顺序,则交换两者的位置;直到第n+1-i个数为止。第一个数与第

29、二个数比较,第二个数与第三个数比较,.,第n-i个与第n+1-i个比较。此时第n+1-i个位置上的数已经按要求排好,所以不参加以后的比较和交换操作。第五章 汇编语言程序设计33给 数 组 赋 值加 载 外 循 环 次 数 n-1加 载 内 循 环 次 数 n-i加 载 数 组 指 针当 前 数 和 下个 数 比 较两 数 交 换内 循 环 满n-i次 ?外 循 环 满n-1次 ?YESNOYES结 束NO程序流程图第五章 汇编语言程序设计34 ORG $1000data:FCB $12,$13,$11,$20,$10,$10,$19,$6,$1a,$fe ORG $4000Entry: LDS

30、 #$3FFF ; initialize the stack pointer CLI ; enable interruptsLDX #data;X加载立即数$1000作为地址使用LDY #9;Y加载立即数n-1作为外循环使用,n为数组元素个数LOOP0:PSHY;外循环数进栈保存LDX #data;X加载$1000作为地址 LOOP1:LDAA X;内循环n-1次开始,A加载第一个数LDAB 1,X;B加载第二个数CBA;作A-B操作,只影响标志BCS NOCHANGE;如果C=1,则跳转,C=1的含义是作了减法,前者小于后者则不用处理第五章 汇编语言程序设计35STAA 1,X;如果第一个数大于第二个数,则交换位置STAB XNOCHANGE:;如果不交换,则跳转到这里INX;指向下一个内存单元继续比较DEY;内循环次数减一BNE LOOP1;内循环是否够n-i次,若够则退出,i表示第i次外循环PULY;外循环次数出栈DEY;外循环次数减一BNE LOOP0;若外循环次数够n-1次,则退出BRA *;第五章 汇编语言程序设计36例例10. 求数组的平均值求数组的平均值

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论