3

重温51汇编指令(附实验) - iron2222

 2 years ago
source link: https://www.cnblogs.com/iron2222/p/16156361.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

重温51汇编指令(附实验)

写在前面:

在电子控制的课上,老师带我们重温了一些51的汇编指令,有了一些新的思考,感觉非常的有趣,所以这里进行总结和尝试。

实验平台:

keil5

b766d45d-e5e1-4504-98c4-fc1cf48f0b80-13059727.jpg

实验目标MCU:

intel的80C51BH

a76c2294-9c39-4df4-95ab-a18653f283ee-13059727.jpg

51寄存器的简单介绍:

通过debug窗口可以进行观察

9bb70cd0-55fc-4acc-b0be-7ddffa8b942b-13059727.jpg

符号以及寄存器意义:

1、r0~r7寄存器组的八个工作寄存器
2、a是累加器,用于运算以及存放数据
3、b是专用寄存器,用于MUL(乘法)、DIV(除法)存放第二操作数、乘积的高位字节、除法余数等。
4、psw属于程序状态字

4.1 p是奇偶标志位

p=1则累加器a中1的个数为奇数;p=0则累加器a中1的个数为偶数。

7a23ac73-0c78-47b5-b772-d0693131b939-13059727.jpg

4.2 ov是溢出标志位,ov=0没有溢出;ov=1溢出

ada7280f-5049-433a-a86a-b14326c6ddab-13059727.jpg

这里进行完ab的乘法运算很显然是溢出了,高8位放到了b中,低8位放在了a里。

4.3 rs是当前寄存器选择位,就是说选择不同的寄存器组。

4.4 f0用户标志位,用户可用软件自定义的一个标志位。

4.5 cy进位标志位,存放算术运算的进位标志,布尔运算中作累加位使用。

096bef7d-585c-4b61-8425-194d453a9d6e-13059727.jpgea7276d6-2c6a-4db8-b3a8-a086f9d46df4-13059727.jpg

执行add指令之前,a是80H,r4是8aH,相加应该是10aH(都是16进制)。

0cc232f1-3a8f-4300-9851-6b38ebe4de67-13059727.jpg

执行完add指令之后,a变成了0aH,进位标志位cy变成了1。

ac辅助进位标志位,做BCD运算时,低四位向高四位进位或错位时,置1。

5、sp栈指针寄存器

默认sp的值位0x07,在执行堆栈操作、程序调用、子程序返回以及中断返回等指令时,sp的值自动+1或-1

d4b4310d-26c8-4b4b-9fe1-98e9d2fc0615-13059727.jpg
6、dptr数据指针寄存器
7、pc程序计数器

程序执行到什么位置了

f4a67ece-f9f6-49c0-b8f0-c565ccf55aaf-13059727.jpg

states没有查到专门解释,我觉的可能是指令执行的数目,因为没执行一条指令会+1,但有时候执行复杂一点的指令,会+3或者+4。

sec这个也没有查到,我感觉应该和时间有关。

汇编指令:

每一种MCU都有自己独特的汇编指令,有相似的地方,但也有很大的不同。所以汇编语言可移植性很不好,但胜在简单高效。

[标号]:操作码 [目的操作数],[源操作数] ; [注释]

  • 数据传送指令 29条

    • 把源地址中的操作数传送到目的地址(寄存器)中
  • 算术运算指令 24条

    • 加减乘除等,第一操作数放在累加器A中,第二操作数放在某个寄存器或者片内RAM中,运算结果会保存在A中,因为运算产的进位标志、奇偶标志和溢出标志等保存在PSW中。
  • 逻辑运算操作指令 24条

    • 逻辑操作与循环移位两类指令

    • 逻辑运算:逻辑乘、逻辑加、逻辑取反、异或等。

    • 也是先把一个操作数放在A中,执行结果也放在A中

  • 位操作指令 17条

  • 控制转移指令 17条

    • MOV A,36H把内部RAM 36H中的数据放在累加器A中
    • MOV A,#20H操作数前加‘#’号就是立即数,不加就是直接地址
  • 寄存器寻址

    • MOV A,R0把当前R6中的内容送到累加器A中
    • MOV R0,#40H

    • MOV A,@R0

数据传送类指令

MOV内部数据传送指令

2b54e40a-f9cc-4927-8526-abc09d57a692-13059727.jpg

MOVC程序存储器读指令

22e894e9-6bf8-4462-8e78-2f0616d6e1aa-13059727.jpg

MOVX外部数据传送指令

XCH整字节交换指令

XCHD半字节交换指令

算术运算类指令

ADD不带进位的加法指令

ADDC带进位的加法指令

f2651466-c9fb-45cb-8cb5-3a481c35cdfd-13059727.jpg
  • 一开始给累加器a=0ach,再向累加器a中加98h,1010 1100 +1001 1000=1 0100 0101
  • 会出现进位,所以这个时候进位标志位cy为1,辅助进位标志位ac为1,溢出标志位ov为1

INC加1指令

71f0b712-e631-4426-a705-adc94ec30266-13059727.jpg

SUBB减法指令

DEC减一指令

2165f46e-6858-4d9f-8b28-a7ab5178a584-13059727.jpg

DA十进制调整指令

33a797cc-9c41-4509-af44-d67af382740e-13059727.jpg

68+89=157 结果a=57 进位标志位cy=1,这就是BCD加法程序

MUL乘法指令

注意乘积,高八位再b中,低八位在a中

c7232651-3398-4add-8cd6-f57f87f759dd-13059727.jpg

DIV除法指令

逻辑运算指令

  • XRL异或
  • CLR清零
  • RL累加器左环移
  • RR累加器右环移
  • RLC累加器带进位左环移
  • RRC累加器带进位右环移

控制转移类指令

  • LJMP长转移指令
  • AJMP绝对转移指令
  • SJMP短转移指令
  • JMP间接转移指令
  • JZ条件转移指令(a=0)
  • JNZ条件转移指令(a不等于0)
  • CJNE比较转移指令
  • DJNZ减一条件转移指令
  • LCALL调用指令(长)
  • ACALL绝对调用指令
  • RET返回指令(子程序)
  • RETI返回指令(中断服务程序)

写在最后:

最后,希望上海疫情早点过去,我不想我的学生生活天天呆在宿舍里。/(ㄒoㄒ)/~~

祝大家早安、午安和晚安


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK