1 / 44

寻址方式与汇编语言

寻址方式与汇编语言. 2010 年 7 月. 控制科学与工程学院. 汇编语言的指令格式. 寻址方式. 汇编语言. 单片机语言. 1. 机器语言   用机器能够直接识别的 二进制指令代码 (即机器码或可执行的目标代码)编写的程序称为机器语言。. 功能:将累加器 A 赋值 1 机器码: 86 01 86 :告诉单片机要实现什么功能 01 :就是数 1. 特点:. 执行速度快 不易记忆 ,十分繁琐。. 2. 汇编语言   用机器指令系统的 助记符 (能反映指令特征和操作性质的英文单词或英文缩写),用符号代替操作数来编写的程序称为汇编语言程序。.

Download Presentation

寻址方式与汇编语言

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 寻址方式与汇编语言 2010年7月 控制科学与工程学院

  2. 汇编语言的指令格式 寻址方式 汇编语言

  3. 单片机语言 1. 机器语言   用机器能够直接识别的二进制指令代码(即机器码或可执行的目标代码)编写的程序称为机器语言。 • 功能:将累加器A赋值1 • 机器码:86 01 • 86:告诉单片机要实现什么功能 • 01:就是数1 特点: 执行速度快 不易记忆,十分繁琐。

  4. 2. 汇编语言   用机器指令系统的助记符(能反映指令特征和操作性质的英文单词或英文缩写),用符号代替操作数来编写的程序称为汇编语言程序。 • 功能:将累加器A赋值1 • 汇编语言: LDAA #$1 • LDDA:LOAD Accumulator A • #$1:就是数1 特点: 用汇编语言编写的程序不仅执行速度快,又可以有效地利用机器本身的专有特性,从而提高机器的工作效率。 用汇编语言编写的程序由于面向机器,在一种机型上不能运行另一种机型的汇编程序,通用性差 。

  5. 汇编语言对格式有严格的要求。典型的汇编语言有4部分组成:汇编语言对格式有严格的要求。典型的汇编语言有4部分组成: label: MOVB #$66 , X ;注释 标号 操作码源操作数 目的操作数 注释 操作码是指令功能的英文缩写,表示指令的功能,由助记符组成。 操作数表示指令操作的对象,不同的指令操作的对象形式不同。 注释说是为了方便阅读加的中文或者英文注释。可有可无。 汇编语言指令格式

  6. 汇编语言是与硬件有关的语言,都是针对某一种类型的CPU。汇编语言是与硬件有关的语言,都是针对某一种类型的CPU。 不同公司的产品,其汇编语言中使用的助记符可能会略有差异,但是语法格式都是一样的。 9S12单片机指令系统每条指令必须有操作码,操作数可以是0-3个 9S12内核的指令系统一共有601条指令。 汇编语言与机器语言指令是一一对应的。

  7. 十进制: 100,255 十六进制: $55、$1234 八进制: @77,@1000 二进制: %01010101 字符串: ‘jkl”990’、”ADDX00’8” 汇编常量的表示 (汇编语言中字符串单引号与双引号无区别,内部有双引号就用单引号,反之亦然。)

  8. 寻址:操作数指定了参与运算的数或者数所在的地址。在单片机的存储空间中,寻找指令规定的操作数的地址。寻址:操作数指定了参与运算的数或者数所在的地址。在单片机的存储空间中,寻找指令规定的操作数的地址。 9S12内核有8种寻址方式。 寻址方式

  9. 隐含寻址 立即数寻址 直接寻址 扩展寻址 相对寻址 变址寻址 累加器变址寻址 带自动加、减的5位偏移量变址寻址

  10. 定义:只有操作码,没有操作数或操作数为寄存器,不显示操作数。定义:只有操作码,没有操作数或操作数为寄存器,不显示操作数。 如:NOP(单片机延时用)PSHA、PSHB、PSHX、PSHY,隐含操作数分别为无、A、B、X、Y。 一般是单字节指令 1. 隐含寻址

  11. ;PC=C003,A=CB,SP=500 NOP ;PC=C004,A=CB,SP=500 PSHA ;A=CB,SP=4FF(说明:500-1),[4FF]=CB NOP是单字节指令,只让程序计数器PC加1 PSHA首先移动SP指针,再压入数值 隐含寻址举例

  12. 在立即数寻址方式下,指令中的操作数(参与运算的数)就直接存放在机器代码中,紧跟在操作码之后。在立即数寻址方式下,指令中的操作数(参与运算的数)就直接存放在机器代码中,紧跟在操作码之后。 这条指令汇编成机器代码后,操作数作为指令的一部分存放在操作码之后的主存单元中。称这种操作数为立即数 立即数寻址方式常用来给寄存器赋值。 注:立即数前加# 2. 立即数寻址

  13. LDAA #$55; 表示将十六进制立即数55加载到累加器A中 LDX #1234; 表示将十进制数1234加载到X中 LDY #%01010101; 表示将二进制数00100110加载到Y中

  14. 操作数是单字节地址(8位),范围是$00~$FF,共256个单元,一般访问I/O寄存器。操作数是单字节地址(8位),范围是$00~$FF,共256个单元,一般访问I/O寄存器。 如: LDAA $55 表示将$55内存单元的数据加载到累加器A。 执行前:[55]=0,A=CB 执行后:[55]=0,A=0 A指八位 3. 直接寻址

  15. 操作数为16位(双字节)地址,可访问64K空间。操作数为16位(双字节)地址,可访问64K空间。 如: LDX $4000 将$4000和$4001内存单元的数据加载到X。 (X表示16位) 4. 扩展寻址

  16. FREESCALE的MCU采用“低字节数放高位地址单元,高字节数放低位地址单元”。FREESCALE的MCU采用“低字节数放高位地址单元,高字节数放低位地址单元”。 (1)若:[$4000]=$12, [$4001]=$34 执行 LDX $4000 指令后, XH(高8位)=$12, XL=$34 (2)又如: STAA $4000 ;执行结果为A的内容存到$4000单元 STAA:Store Accumulator A

  17. 相对转移指令。操作数为单字节 如: 5. 相对寻址 LABEL1:… … BRA LABEL1 … … BRA:Branch always

  18. 操作数由基地址寄存器(X、Y、SP、PC)加偏移量构成。操作数由基地址寄存器(X、Y、SP、PC)加偏移量构成。 如: 若X=$1000 LDAA 0,X ;A=[$1000] LDAA 7,X ;A=[$1000+7] 6. 变址寻址

  19. LDAA -150, X ;A=[$1000-150] LDAA 1000, X ;A=[$1000+1000] LDAA [1000,X] ;将X+1000地址单元中的 值作为指针,指向的内存单元的值加载到累加器A中

  20. 偏移量非立即数,存放在累加器A、B、D中。 如: 若X=$1000 LDAB A,X ;B=[X+A] LDAA D,X ;A=[X+D] 7.累加器变址寻址

  21. 有“先加、先减、后加、后减”四种方式。 基址寄存器可以是X,Y,SP。 主要用于数据块复制。 如: MOVW 2, X+, 4, +Y ;执行该指令,将X开始单元的两个单元内容(一个字)传送到Y+4开始的两个单元,传送完成后X内容加2。 8.带自动加减的5位偏移量间接寻址 MOVW: move a word (两字节) of data from one memory location to another

  22. 数据传输(加载寄存器、传送到内存、内存之间的传输、寄存器间的传输、数据交换、加载有效地址、堆栈操作)指令数据传输(加载寄存器、传送到内存、内存之间的传输、寄存器间的传输、数据交换、加载有效地址、堆栈操作)指令 数学运算(加减乘除、十进制调整、最值等)指令 逻辑运算(移位、求补、取反等)指令 比较测试指令 条件转移、无条件转移、循环指令 查表插值指令 模糊运算指令 系统控制指令(中断、调用、返回等) 指令系统

  23. LOAD指令指从内存到寄存器数据传送 LDAA、LDAB、LDD、LDS、LDX、LDY 如:LDAA #$55 ;将 立即数$55加载到A LDX $2000 ;将$2000和$2001单元数据加载到X STORE指令指从寄存器到内存数据传送 STAA、STAB、STD、STS、STX、STY 如:STAA $1000 ;将A的内容存到$1000单元 STY $2000 ;将Y的内容存到$2000和$2001单元 MOVE指令指从内存到内存数据传送 MOVB、MOVW 如:MOVB $2000,X ;将$2000单元内容存到X内容指向单元 MOVW 2,X+,4,Y+;将X和X+1内容指向单元存到Y和Y+1指向单元 数据传输指令

  24. TRANSFER传送指令指从寄存器到寄存器数据传送:TRANSFER传送指令指从寄存器到寄存器数据传送: TAB、TAP、TBA、TFR、TPA、TSX、TSY、TXS、TYS 如: 若累加器A中的数据为$55 执行TAB指令后,累加器B中的数据为$55。 EXCHANGE交换指令指寄存器的数据与寄存器数据交换: EXG、XGDX、XGDY、SEX 如: 若A中数据为$55,B中数据为$aa 执行EXG A,B 后,A中数据为$aa,B中数据为$55。 LEA有效地址加载指令: LEAS、LEAX、LEAY 如: LDY #$2000 LEAS 4,Y+ 执行后SP的值为$2000,Y的值为$2004。 数据传输指令

  25. 堆栈操作指令: 单字节压栈出栈 PSHA、PSHB、PSHC PULA、PULB、PULC 如PSHA指SP减一,A数据传送到SP指向单元 PULA指SP指向单元数据传送到A,SP加一 双字节压栈出栈 PSHD、PSHX、PSHY PULD、PULX、PULY 如PSHD指SP减二,D数据高位(A)传送到SP指向单元,低位(B)传送到SP+1指向单元。 PULD指SP指向单元数据传送到D高位(A),SP+1指向单元数据传送到低位(B), SP加二。 数据传输指令

  26. 数据传输指令举例 ;++++加载/存储++++ LDAA #$55 ;A累加器加载$55 STAA $480 ;把A的内容存到内存$480 LDAB $480 ;$480内容加载到B INCB ;B内容自加1 STD $485 ;D内容送$485 ;++++传送交换指令++++ LDAB #$AA ;立即数$AA送B TAB ;A送B LDAB #$AA ;立即数$AA送B EXG A,B ;A B交换 ;++++MOVE指令++++ MOVW #$1234,$490;立即数$1234传送到$490和 $491单元

  27. 加法指令ADD: 8位加法指令ABA、 ADDA、 ADDB、 ADCA、ADCB 16位加法指令ABX、ABY、 ADDD 减法指令SUB: 8位减法指令SBA、SUBA、SUBB、SBCA、SBCB 16位减法指令SUBD 十进制调整指令:DAA (只能用在结果在A中的加法指令) 加一指令:INC、INCA、INCB、INS、INX、INY 减一指令:DEC、DECA、DECB、DES、DEX、DEY 数学运算指令

  28. 乘法指令MUL: 无符号16位数乘法EMUL (D)×(Y)送Y:D 有符号16位数乘法EMULS (D)×(Y)送Y:D 无符号8位数乘法MUL (A)×(B)送A:B 除法指令DIV: 无符号32位数除以16位数EDIV 有符号32位数除以16位数EDIVS 无符号16位数除以16位数的小数除法FDIV 无符号16位数除以16位数IDIV 有符号16位数除以16位数IDIVS 乘加指令EMACS 数学运算指令

  29. 最大、最小值指令 MAXA、 MINA :A中数据与内存单元字节型数据比较,较大的传送到A MAXM、 MINM:A中数据与内存单元字节型数据比较,较大的传送到内存单元 EMAXD、 EMIND :D中数据与内存单元中两个相临字节型数据组成的字数据比较,大者送D EMAXM 、EMINM:D中数据与内存单元中两个相临字节型数据组成的字数据比较,大者送内存单元 数学运算指令

  30. 在$2000单元开始存放字节型数据$10,$30,$04,$A0,在$2010单元开始存放字节型数据$11,$1A,$09,$1F,分别使用加、减、乘、除四中运算处理对应位置的数据。并把结果存到$2020开始的内存单元中。在$2000单元开始存放字节型数据$10,$30,$04,$A0,在$2010单元开始存放字节型数据$11,$1A,$09,$1F,分别使用加、减、乘、除四中运算处理对应位置的数据。并把结果存到$2020开始的内存单元中。 例子程序见word文档 实际程序见:2-shuxue-example 数学运算综合举例

  31. 与指令:ANDA、ANDB、ANDCC 如 LDY #$1000 ANDA Y A与$1000单元数据与运算,结果保存到A 异或指令:EORA、EORB 或指令:ORAA、ORAB、ORCC 清零指令:CLC、CLI、CLV、CLR、CLRA、CLRB 把进位、中断屏蔽、溢出标志、内存单元,A,B清零 取反指令:COM、COMA、COMB 对内存单元、A、B进行取反运算并存储 求补指令:NEG、NEGA、NEGB 对内存单元、A、B进行求补运算并存储 逻辑运算指令

  32. 位测试指令:BITA、BITB 将A或B与内存单元内容作与操作,改变标志位 位操作指令:BCLR、BSET BCLR:将立即数取反与内存单元M内容与操作,将结果送内存单元 BSET:将立即数与内存单元M内容或操作,将结果送内存单元 逻辑左移指令:LSL、LSLA、LSLB、LSLD 将内存字节、A、B、D内容带C左移 逻辑右移指令:LSR、LSRA、LSRB、LSRD 将内存字节、A、B、D内容带C右移 逻辑运算指令

  33. 算术左移指令:ASL、ASLA、ASLB、ASLD 同逻辑左移 算术右移指令:ASR、ASRA、ASRB 将内存字节、A、B内容右移一位,最高位不变,最低位移动到C。 循环左移指令:ROL、ROLA、ROLB 循环右移指令:ROR、RORA、RORB 逻辑运算指令

  34. 取数$55,使用逻辑运算指令使低4位清零,然后低4位置一;对结果取反操作;逻辑右移一位;与内存单元中$00作位测试;查看结果。取数$55,使用逻辑运算指令使低4位清零,然后低4位置一;对结果取反操作;逻辑右移一位;与内存单元中$00作位测试;查看结果。 逻辑运算指令举例

  35. S1: FCB $00 ;定义参加比较数据 LDAA #$55 ;A=55 ANDA #$F0 ;A=50 ORAA #$0F ;A=5F NEGA ;A=A1 LSRA ;A=50 C=1 BITA S1 ;Z=1 逻辑运算指令举例

  36. 比较指令:CBA、CMPA、CMPB、CPD、CPS、CPX、CPY 只做减法操作,不返回结果,影响标志位C(借位)、V(溢出),N(符号),Z(零) 测试指令:TST、TSTA、TSTB 测试内存单元、A或B是否为0,影响标志位N(符号),Z(零),V(总为0),C(总为0)。 比较测试指令

  37. 短转移指令: 无条件转移BRA、BRN 有条件转移BCC、BCS、BEQ、BNE、BMI、BPL、BVC、BVS、BHI、BHS、BLO、BLS、BGT、BGE、BLT、BLE 长转移指令:在短转移前加“L” 如:LBRA等。 转移跳转循环指令

  38. 循环控制指令: DBEQ、DBNE IBEQ、IBNE TBEQ、TBNE 跳转指令:JMP 无条件跳转到标号处执行,范围为64K。 转移跳转循环指令 DBEQ B,LABEL … LABEL: … LABEL : … … DBNE B,LABEL B减1,若为0 B减1,若不为0

  39. 定义程序标号,从该程序标号开始执行程序;做5次空循环延时;A,B都给$55,作CBA测试;若Z=1则跳转到程序末尾。定义程序标号,从该程序标号开始执行程序;做5次空循环延时;A,B都给$55,作CBA测试;若Z=1则跳转到程序末尾。 比较测试转移跳转指令举例

  40. BRA J1 ;短转移到J1 NOP ;由于转移,此句不执行 J1:LDAB #$05 ;B=05 J2:NOP ;延时的NOP指令 DBNE B,J2 ;B-1,若B=0则继续,否则到J2 LDAA #$55 LDAB #$55 ;A=B=55 CBA ;做A-B操作,Z=1 BEQ J3 ;若Z=1转J3 NOP ;此句不执行 J3:NOP ;转移到此执行 比较测试转移跳转指令举例

  41. 查表插值指令: TBL ETBL 例子请见课本115页 查表插值指令

  42. 子程序调用返回返回指令: 短子程序调用BSR(-128~127),子程序返回使用RTS 长子程序调用JSR(64K范围),子程序返回使用RTS 跨页子程序调用CALL(1M范围)、子程序返回使用RTC 调用和返回同时把返回地址和PPAGE寄存器内容压栈和出栈 中断指令: 软件中断SWI,把返回地址和CPU寄存器依次全部压栈 陷阱中断TRAP,把返回地址和CPU寄存器依次全部压栈 中断返回RTI,把返回地址和CPU寄存器依次全部出栈 系统指令

  43. 其他指令: STOP 将PC、Y、X、D、CCR压栈,关闭时钟 WAI 将PC、Y、X、D、CCR压栈,关闭时钟,各自系统仍然运行,CPU等待中断 BGND 进入背景调试模式 NOP 空操作 系统指令

  44. 谢谢!

More Related