- 打卡等级:偶尔看看I
- 打卡总天数:16
- 最近打卡:2025-04-30 08:41:32
荣誉版主
- 积分
- 12882
|
发表于 2024-6-12 12:42:46
|
显示全部楼层
本帖最后由 杨为民 于 2024-6-12 12:52 编辑
(1)我觉得除了回答楼主除了想要知道“具体在汇编程序中怎么表示#0DATA16,#1DATA16”外,普及一下如何在A251中如何向一个32位寄存器赋值一个32位的立即数对更多的坛友更有用,所以就给出了其他的回复内容。对于楼主的问题,再专门补充说明一下。
(2) 指令集和汇编语言语句未必相同,“MOV DRk,#0 DATA16 和 MOV DRk,#1 DATA16”这是两条指令,
(3)但是在A251里这两条指令对应的汇编语句都只对应同一个汇编语言语句“MOV DRk,# DATA16 ”。
在A251中,默认DATA16是一个正的16位无符号整数,然后编译器会根据具体情况决定使用那一种。
(4)比如根据正负号,对应的编码是不一样的:
000088 7E680001 226 MOV DR24, # 1;
00008C 7E6CFFFF 227 MOV DR24, # -1;
000090 7E68FFFF 228 MOV DR24, # 0FFFFH;
000094 7E6C0001 229 MOV DR24, # -0FFFFH;
(5)如果要强制使用,2楼给出的方法是正确的。
要想使用“MOV DRk,#0 DATA16 ”指令,请确保立即数的高16位为“0000H”,否则编译出错。
000098 7E688678 230 MOV DR24, # 00008678H;
要想使用“MOV DRk,#1 DATA16 ”指令,请确保立即数的高16位为“0FFFFH”,否则编译出错。
00009C 7E6C8678 231 MOV DR24, # 0FFFF8678H;
(6)因此对于汇编语言语句“MOV DR24, #18678H;”,会被A251编译器分解为“MOV DR24, # 18678H;”,默认这是一个无符号整数,高16位为“1H”,编译出错。
(7)但是对于C语言的“xxx=0x18678”,C251编译器不会报错,会自动编译为正确的16位立即数赋值指令。
502 ; line 35: long xxx;
503 ; line 36: xxx=0x18678;
000002 7E348678 504 MOV WR6,#08678H
000006 7E240001 505 MOV WR4,#01H
|
1
喜欢他/她就送朵鲜花吧,赠人玫瑰,手有余香!
-
+2
楼主威武~
|