寻址方式与汇编语言

44
寻寻寻寻寻寻寻寻寻 2010 寻 7 寻 寻寻寻寻寻寻寻寻寻

description

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

Transcript of 寻址方式与汇编语言

Page 1: 寻址方式与汇编语言

寻址方式与汇编语言

2010 年 7 月控制科学与工程学院

Page 2: 寻址方式与汇编语言

汇编语言的指令格式

汇编语言

寻址方式

Page 3: 寻址方式与汇编语言

1. 机器语言  用机器能够直接识别的二进制指令代码(即机器码或可执行的目标代码)编写的程序称为机器语言。

执行速度快

不易记忆,十分繁琐。

特点:特点:

单片机语言

•功能:将累加器 A 赋值 1•机器码: 86 01

•86 :告诉单片机要实现什么功能•01 :就是数 1

Page 4: 寻址方式与汇编语言

2. 汇编语言  用机器指令系统的助记符(能反映指令特征和操作性质的英文单词或英文缩写),用符号代替操作数来编写的程序称为汇编语言程序。

用汇编语言编写的程序不仅执行速度快,又可以有效地利用机器本身的专有特性,从而提高机器的工作效率。

用汇编语言编写的程序由于面向机器,在一种机型上不能运行另一种机型的汇编程序,通用性差 。

特点:特点:

•功能:将累加器 A 赋值 1•汇编语言: LDAA #$1

•LDDA : LOAD Accumulator A•#$1 :就是数 1

Page 5: 寻址方式与汇编语言

汇编语言指令格式汇编语言对格式有严格的要求。典型的汇编语言有

4 部分组成 :

label: MOVB #$66 , X ;注释 标号 操作码 源操作数 目的操作数 注释• 操作码是指令功能的英文缩写,表示指令的功能,

由助记符组成。• 操作数表示指令操作的对象,不同的指令操作的

对象形式不同。• 注释说是为了方便阅读加的中文或者英文注释。

可有可无。

Page 6: 寻址方式与汇编语言

• 汇编语言是与硬件有关的语言,都是针对某一种类型的 CPU 。

• 不同公司的产品,其汇编语言中使用的助记符可能会略有差异,但是语法格式都是一样的。

• 9S12 单片机指令系统每条指令必须有操作码,操作数可以是 0-3 个

• 9S12 内核的指令系统一共有 601 条指令。• 汇编语言与机器语言指令是一一对应的。

Page 7: 寻址方式与汇编语言

汇编常量的表示

• 十进制: 100 , 255

• 十六进制: $55 、 $1234

• 八进制: @77,@1000

• 二进制: %01010101

• 字符串: ‘ jkl”990’ 、” ADDX00’8”

(汇编语言中字符串单引号与双引号无区别,内部有双引号就用单引号,反之亦然。)

Page 8: 寻址方式与汇编语言

寻址方式

• 寻址:操作数指定了参与运算的数或者数所在的地址。在单片机的存储空间中,寻找指令规定的操作数的地址。

• 9S12 内核有 8 种寻址方式。

Page 9: 寻址方式与汇编语言

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

Page 10: 寻址方式与汇编语言

1. 隐含寻址

• 定义:只有操作码,没有操作数或操作数为寄存器,不显示操作数。

• 如: NOP (单片机延时用) PSHA 、 PSHB 、PSHX 、 PSHY ,隐含操作数分别为无、 A 、B 、 X 、 Y 。

• 一般是单字节指令

Page 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 指针 , 再压入数值

Page 12: 寻址方式与汇编语言

• 在立即数寻址方式下,指令中的操作数(参与运算的数)就直接存放在机器代码中,紧跟在操作码之后。

• 这条指令汇编成机器代码后,操作数作为指令的一部分存放在操作码之后的主存单元中。称这种操作数为立即数

• 立即数寻址方式常用来给寄存器赋值。 • 注:立即数前加 #

2. 立即数寻址

Page 13: 寻址方式与汇编语言

• LDAA #$55;– 表示将十六进制立即数 55 加载到累加器 A 中

• LDX #1234;– 表示将十进制数 1234 加载到 X 中

• LDY #%01010101;– 表示将二进制数 00100110 加载到 Y 中

Page 14: 寻址方式与汇编语言

3. 直接寻址

• 操作数是单字节地址( 8 位),范围是 $00~$FF ,共 256 个单元,一般访问 I/O 寄存器。

• 如: LDAA $55表示将 $55 内存单元的数据加载到累加器 A 。

执行前 :[55]=0,A=CB

执行后 :[55]=0,A=0

A 指八位

Page 15: 寻址方式与汇编语言

4. 扩展寻址

• 操作数为 16 位(双字节)地址,可访问 64K 空间。

• 如: LDX $4000

将 $4000 和 $4001 内存单元的数据加载到 X 。( X 表示 16 位)

Page 16: 寻址方式与汇编语言

• FREESCALE 的 MCU 采用“低字节数放高位地址单元,高字节数放低位地址单元”。

• ( 1 )若: [$4000]=$12, [$4001]=$34• 执行 LDX $4000 指令后,• XH (高 8 位) =$12, XL=$

34• ( 2 )又如: STAA $4000• ; 执行结果为 A 的内容存到 $4000 单元STAA:Store Accumulator A

Page 17: 寻址方式与汇编语言

5. 相对寻址

• 相对转移指令。操作数为单字节

• 如:LABEL1: …

BRA LABEL1

BRA : Branch always

Page 18: 寻址方式与汇编语言

6. 变址寻址

• 操作数由基地址寄存器( X 、 Y 、 SP 、 PC )加偏移量构成。

• 如: 若 X=$1000

LDAA 0,X ;A=[$1000]

LDAA 7,X ;A=[$1000+7]

Page 19: 寻址方式与汇编语言

LDAA -150, X ;A=[$1000-150]

LDAA 1000, X ;A=[$1000+1000]

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

Page 20: 寻址方式与汇编语言

7.累加器变址寻址

• 偏移量非立即数,存放在累加器 A 、 B 、 D中。

• 如: 若 X=$1000

• LDAB A,X ;B=[X+A]

LDAA D,X ;A=[X+D]

Page 21: 寻址方式与汇编语言

8.带自动加减的 5位偏移量间接寻址

• 有“先加、先减、后加、后减”四种方式。• 基址寄存器可以是 X , Y , SP 。• 主要用于数据块复制。• 如: MOVW 2, X+, 4, +Y

• ; 执行该指令,将 X开始单元的两个单元内容(一个字)传送到 Y+4开始的两个单元,传送完成后 X 内容加 2 。

MOVW: move a word (两字节)of data from one memory location to another

Page 22: 寻址方式与汇编语言

指令系统• 数据传输(加载寄存器、传送到内存、内存之间的传输、寄存器间的传输、数据交换、加载有效地址、堆栈操作)指令

• 数学运算(加减乘除、十进制调整、最值等)指令• 逻辑运算(移位、求补、取反等)指令• 比较测试指令• 条件转移、无条件转移、循环指令• 查表插值指令• 模糊运算指令• 系统控制指令(中断、调用、返回等)

Page 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 指向单元

Page 24: 寻址方式与汇编语言

数据传输指令• 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 。

Page 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 加二。

Page 26: 寻址方式与汇编语言

数据传输指令举例;++++ 加载 / 存储 ++++LDAA #$55 ;A 累加器加载 $55STAA $480 ;把 A 的内容存到内存 $480LDAB $480 ;$480 内容加载到 BINCB ;B 内容自加 1STD $485 ;D 内容送 $485;++++传送交换指令 ++++LDAB #$AA ; 立即数 $AA送 BTAB ;A送 BLDAB #$AA ; 立即数 $AA送 BEXG A,B ;A B交换;++++MOVE 指令 ++++MOVW #$1234,$490; 立即数 $1234传送到 $49

0 和$491 单元

Page 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

Page 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

Page 29: 寻址方式与汇编语言

数学运算指令

• 最大、最小值指令– MAXA 、 MINA : A 中数据与内存单元字节型数据比较,较大的传送到 A

– MAXM 、 MINM : A 中数据与内存单元字节型数据比较,较大的传送到内存单元

– EMAXD 、 EMIND : D 中数据与内存单元中两个相临字节型数据组成的字数据比较,大者送 D

– EMAXM 、 EMINM : D 中数据与内存单元中两个相临字节型数据组成的字数据比较,大者送内存单元

Page 30: 寻址方式与汇编语言

数学运算综合举例

• 在 $2000 单元开始存放字节型数据 $10,$30,$04,$A0 ,在 $2010 单元开始存放字节型数据 $11,$1A,$09,$1F ,分别使用加、减、乘、除四中运算处理对应位置的数据。并把结果存到 $2020开始的内存单元中。

• 例子程序见 word 文档• 实际程序见: 2-shuxue-example

Page 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 进行求补运算并存储

Page 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右移

Page 33: 寻址方式与汇编语言

逻辑运算指令• 算术左移指令: ASL 、 ASLA 、 ASLB 、 ASL

D– 同逻辑左移

• 算术右移指令: ASR 、 ASRA 、 ASRB– 将内存字节、 A 、 B 内容右移一位,最高位不变,最低位移动到 C 。

• 循环左移指令: ROL 、 ROLA 、 ROLB

• 循环右移指令: ROR 、 RORA 、 RORB

Page 34: 寻址方式与汇编语言

逻辑运算指令举例

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

Page 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

Page 36: 寻址方式与汇编语言

比较测试指令

• 比较指令: CBA 、 CMPA 、 CMPB 、 CPD 、 CPS 、 CPX 、 CPY– 只做减法操作,不返回结果,影响标志位 C

(借位)、 V (溢出), N (符号), Z(零)

• 测试指令: TST 、 TSTA 、 TSTB–测试内存单元、 A 或 B 是否为 0 ,影响标志位

N (符号), Z (零), V (总为 0 ), C(总为 0 )。

Page 37: 寻址方式与汇编语言

转移跳转循环指令

• 短转移指令:– 无条件转移 BRA 、 BRN– 有条件转移 BCC 、 BCS 、 BEQ 、 BNE 、 B

MI 、 BPL 、 BVC 、 BVS 、 BHI 、 BHS 、 BLO 、 BLS 、 BGT 、 BGE 、 BLT 、 BLE

• 长转移指令:在短转移前加“ L”

如: LBRA等。

Page 38: 寻址方式与汇编语言

转移跳转循环指令

• 循环控制指令:– DBEQ 、 DBNE– IBEQ 、 IBNE– TBEQ 、 TBNE

• 跳转指令: JMP– 无条件跳转到标号处执行,范围为 64K 。

DBEQ B,LABEL

LABEL: …

B 减 1, 若为 0

LABEL : …

DBNE B,LABEL

B 减 1, 若不为 0

Page 39: 寻址方式与汇编语言

比较测试转移跳转指令举例

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

Page 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 ;转移到此执行

Page 41: 寻址方式与汇编语言

查表插值指令

• 查表插值指令:– TBL – ETBL

• 例子请见课本 115页

Page 42: 寻址方式与汇编语言

系统指令• 子程序调用返回返回指令:

– 短子程序调用 BSR ( -128~127 ),子程序返回使用 RTS– 长子程序调用 JSR ( 64K 范围),子程序返回使用 RTS– 跨页子程序调用 CALL ( 1M 范围)、子程序返回使用 RTC

调用和返回同时把返回地址和 PPAGE 寄存器内容压栈和出栈• 中断指令:

– 软件中断 SWI ,把返回地址和 CPU 寄存器依次全部压栈– 陷阱中断 TRAP ,把返回地址和 CPU 寄存器依次全部压栈– 中断返回 RTI ,把返回地址和 CPU 寄存器依次全部出栈

Page 43: 寻址方式与汇编语言

系统指令

• 其他指令:– STOP 将 PC 、 Y 、 X 、 D 、 CCR 压栈,

关闭时钟– WAI 将 PC 、 Y 、 X 、 D 、 CCR 压栈,关闭

时钟,各自系统仍然运行, CPU等待中断– BGND 进入背景调试模式– NOP 空操作

Page 44: 寻址方式与汇编语言

谢谢!