440 likes | 594 Views
寻址方式与汇编语言. 2010 年 7 月. 控制科学与工程学院. 汇编语言的指令格式. 寻址方式. 汇编语言. 单片机语言. 1. 机器语言 用机器能够直接识别的 二进制指令代码 (即机器码或可执行的目标代码)编写的程序称为机器语言。. 功能:将累加器 A 赋值 1 机器码: 86 01 86 :告诉单片机要实现什么功能 01 :就是数 1. 特点:. 执行速度快 不易记忆 ,十分繁琐。. 2. 汇编语言 用机器指令系统的 助记符 (能反映指令特征和操作性质的英文单词或英文缩写),用符号代替操作数来编写的程序称为汇编语言程序。.
E N D
寻址方式与汇编语言 2010年7月 控制科学与工程学院
汇编语言的指令格式 寻址方式 汇编语言
单片机语言 1. 机器语言 用机器能够直接识别的二进制指令代码(即机器码或可执行的目标代码)编写的程序称为机器语言。 • 功能:将累加器A赋值1 • 机器码:86 01 • 86:告诉单片机要实现什么功能 • 01:就是数1 特点: 执行速度快 不易记忆,十分繁琐。
2. 汇编语言 用机器指令系统的助记符(能反映指令特征和操作性质的英文单词或英文缩写),用符号代替操作数来编写的程序称为汇编语言程序。 • 功能:将累加器A赋值1 • 汇编语言: LDAA #$1 • LDDA:LOAD Accumulator A • #$1:就是数1 特点: 用汇编语言编写的程序不仅执行速度快,又可以有效地利用机器本身的专有特性,从而提高机器的工作效率。 用汇编语言编写的程序由于面向机器,在一种机型上不能运行另一种机型的汇编程序,通用性差 。
汇编语言对格式有严格的要求。典型的汇编语言有4部分组成:汇编语言对格式有严格的要求。典型的汇编语言有4部分组成: label: MOVB #$66 , X ;注释 标号 操作码源操作数 目的操作数 注释 操作码是指令功能的英文缩写,表示指令的功能,由助记符组成。 操作数表示指令操作的对象,不同的指令操作的对象形式不同。 注释说是为了方便阅读加的中文或者英文注释。可有可无。 汇编语言指令格式
汇编语言是与硬件有关的语言,都是针对某一种类型的CPU。汇编语言是与硬件有关的语言,都是针对某一种类型的CPU。 不同公司的产品,其汇编语言中使用的助记符可能会略有差异,但是语法格式都是一样的。 9S12单片机指令系统每条指令必须有操作码,操作数可以是0-3个 9S12内核的指令系统一共有601条指令。 汇编语言与机器语言指令是一一对应的。
十进制: 100,255 十六进制: $55、$1234 八进制: @77,@1000 二进制: %01010101 字符串: ‘jkl”990’、”ADDX00’8” 汇编常量的表示 (汇编语言中字符串单引号与双引号无区别,内部有双引号就用单引号,反之亦然。)
寻址:操作数指定了参与运算的数或者数所在的地址。在单片机的存储空间中,寻找指令规定的操作数的地址。寻址:操作数指定了参与运算的数或者数所在的地址。在单片机的存储空间中,寻找指令规定的操作数的地址。 9S12内核有8种寻址方式。 寻址方式
隐含寻址 立即数寻址 直接寻址 扩展寻址 相对寻址 变址寻址 累加器变址寻址 带自动加、减的5位偏移量变址寻址
定义:只有操作码,没有操作数或操作数为寄存器,不显示操作数。定义:只有操作码,没有操作数或操作数为寄存器,不显示操作数。 如:NOP(单片机延时用)PSHA、PSHB、PSHX、PSHY,隐含操作数分别为无、A、B、X、Y。 一般是单字节指令 1. 隐含寻址
;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指针,再压入数值 隐含寻址举例
在立即数寻址方式下,指令中的操作数(参与运算的数)就直接存放在机器代码中,紧跟在操作码之后。在立即数寻址方式下,指令中的操作数(参与运算的数)就直接存放在机器代码中,紧跟在操作码之后。 这条指令汇编成机器代码后,操作数作为指令的一部分存放在操作码之后的主存单元中。称这种操作数为立即数 立即数寻址方式常用来给寄存器赋值。 注:立即数前加# 2. 立即数寻址
LDAA #$55; 表示将十六进制立即数55加载到累加器A中 LDX #1234; 表示将十进制数1234加载到X中 LDY #%01010101; 表示将二进制数00100110加载到Y中
操作数是单字节地址(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. 直接寻址
操作数为16位(双字节)地址,可访问64K空间。操作数为16位(双字节)地址,可访问64K空间。 如: LDX $4000 将$4000和$4001内存单元的数据加载到X。 (X表示16位) 4. 扩展寻址
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
相对转移指令。操作数为单字节 如: 5. 相对寻址 LABEL1:… … BRA LABEL1 … … BRA:Branch always
操作数由基地址寄存器(X、Y、SP、PC)加偏移量构成。操作数由基地址寄存器(X、Y、SP、PC)加偏移量构成。 如: 若X=$1000 LDAA 0,X ;A=[$1000] LDAA 7,X ;A=[$1000+7] 6. 变址寻址
LDAA -150, X ;A=[$1000-150] LDAA 1000, X ;A=[$1000+1000] LDAA [1000,X] ;将X+1000地址单元中的 值作为指针,指向的内存单元的值加载到累加器A中
偏移量非立即数,存放在累加器A、B、D中。 如: 若X=$1000 LDAB A,X ;B=[X+A] LDAA D,X ;A=[X+D] 7.累加器变址寻址
有“先加、先减、后加、后减”四种方式。 基址寄存器可以是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
数据传输(加载寄存器、传送到内存、内存之间的传输、寄存器间的传输、数据交换、加载有效地址、堆栈操作)指令数据传输(加载寄存器、传送到内存、内存之间的传输、寄存器间的传输、数据交换、加载有效地址、堆栈操作)指令 数学运算(加减乘除、十进制调整、最值等)指令 逻辑运算(移位、求补、取反等)指令 比较测试指令 条件转移、无条件转移、循环指令 查表插值指令 模糊运算指令 系统控制指令(中断、调用、返回等) 指令系统
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指向单元 数据传输指令
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。 数据传输指令
堆栈操作指令: 单字节压栈出栈 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加二。 数据传输指令
数据传输指令举例 ;++++加载/存储++++ 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单元
加法指令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 数学运算指令
乘法指令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 数学运算指令
最大、最小值指令 MAXA、 MINA :A中数据与内存单元字节型数据比较,较大的传送到A MAXM、 MINM:A中数据与内存单元字节型数据比较,较大的传送到内存单元 EMAXD、 EMIND :D中数据与内存单元中两个相临字节型数据组成的字数据比较,大者送D EMAXM 、EMINM:D中数据与内存单元中两个相临字节型数据组成的字数据比较,大者送内存单元 数学运算指令
在$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 数学运算综合举例
与指令: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进行求补运算并存储 逻辑运算指令
位测试指令: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右移 逻辑运算指令
算术左移指令:ASL、ASLA、ASLB、ASLD 同逻辑左移 算术右移指令:ASR、ASRA、ASRB 将内存字节、A、B内容右移一位,最高位不变,最低位移动到C。 循环左移指令:ROL、ROLA、ROLB 循环右移指令:ROR、RORA、RORB 逻辑运算指令
取数$55,使用逻辑运算指令使低4位清零,然后低4位置一;对结果取反操作;逻辑右移一位;与内存单元中$00作位测试;查看结果。取数$55,使用逻辑运算指令使低4位清零,然后低4位置一;对结果取反操作;逻辑右移一位;与内存单元中$00作位测试;查看结果。 逻辑运算指令举例
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 逻辑运算指令举例
比较指令:CBA、CMPA、CMPB、CPD、CPS、CPX、CPY 只做减法操作,不返回结果,影响标志位C(借位)、V(溢出),N(符号),Z(零) 测试指令:TST、TSTA、TSTB 测试内存单元、A或B是否为0,影响标志位N(符号),Z(零),V(总为0),C(总为0)。 比较测试指令
短转移指令: 无条件转移BRA、BRN 有条件转移BCC、BCS、BEQ、BNE、BMI、BPL、BVC、BVS、BHI、BHS、BLO、BLS、BGT、BGE、BLT、BLE 长转移指令:在短转移前加“L” 如:LBRA等。 转移跳转循环指令
循环控制指令: DBEQ、DBNE IBEQ、IBNE TBEQ、TBNE 跳转指令:JMP 无条件跳转到标号处执行,范围为64K。 转移跳转循环指令 DBEQ B,LABEL … LABEL: … LABEL : … … DBNE B,LABEL B减1,若为0 B减1,若不为0
定义程序标号,从该程序标号开始执行程序;做5次空循环延时;A,B都给$55,作CBA测试;若Z=1则跳转到程序末尾。定义程序标号,从该程序标号开始执行程序;做5次空循环延时;A,B都给$55,作CBA测试;若Z=1则跳转到程序末尾。 比较测试转移跳转指令举例
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 ;转移到此执行 比较测试转移跳转指令举例
查表插值指令: TBL ETBL 例子请见课本115页 查表插值指令
子程序调用返回返回指令: 短子程序调用BSR(-128~127),子程序返回使用RTS 长子程序调用JSR(64K范围),子程序返回使用RTS 跨页子程序调用CALL(1M范围)、子程序返回使用RTC 调用和返回同时把返回地址和PPAGE寄存器内容压栈和出栈 中断指令: 软件中断SWI,把返回地址和CPU寄存器依次全部压栈 陷阱中断TRAP,把返回地址和CPU寄存器依次全部压栈 中断返回RTI,把返回地址和CPU寄存器依次全部出栈 系统指令
其他指令: STOP 将PC、Y、X、D、CCR压栈,关闭时钟 WAI 将PC、Y、X、D、CCR压栈,关闭时钟,各自系统仍然运行,CPU等待中断 BGND 进入背景调试模式 NOP 空操作 系统指令