MOV DRk,#0DATA16 和 MOV DRk,#1DATA16 具体怎么表示?
MOV DRk,#0DATA16 和MOV DRk,#1DATA16 具体怎么表示?看数据手册中说,#0DATA16 就是把32位立即数的高位字(高16)位填“0”,#1DATA16 就是把32位立即数的高位字(高16)填“1”。
具体在汇编程序中怎么表示#0DATA16,#1DATA16
我在程序中写下面的指令,编译报错:
MOV DR24,#18678H编译报错:main.asm(25): error A100: ILLEGAL CONSTANT VALUE
zhp 发表于 2024-6-11 13:29
使用下面的指令格式:
MOV DR0,#00001234H
MOV DR4,#0FFFF5678H
试了,可以。谢谢! 本帖最后由 杨为民 于 2024-6-12 03:06 编辑
fxg2024 发表于 2024-6-11 16:26
试了,可以。谢谢!(1)这个写法只适用于16位立即数,因此上面程序的结果是:
000086 7E081234 225 MOV DR0,#00001234H
(DR0)--> 000001234H
00008A 7E1C5678 226 MOV DR4,#0FFFF5678H
(DR4)--> 0FFFF5678H
00008E 7E181234 227 MOV DR4,#00001234H
(DR4)--> 000001234H
(2)对于32位立即数,正确做法是对高低16位寄存器分别赋高低16位的值:
//MOV DR4,#012345678H
MOV WR4,#01234H
MOV WR6,#05678H
000092 7E241234 228 MOV WR4,#01234H
000096 7E345678 229 MOV WR6,#05678H
这样结果为:
(DR4)=(WR4 WR6)--> 012345678H
本帖最后由 杨为民 于 2024-6-12 02:56 编辑
zhp 发表于 2024-6-11 13:29
使用下面的指令格式:
MOV DR0,#00001234H
MOV DR4,#0FFFF5678H
这个写法只适用于16位立即数 本帖最后由 杨为民 于 2024-6-12 12:52 编辑
zhp 发表于 2024-6-12 08:42
是的,杨老师您说的没错!
但楼主的问题是(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)因此对于汇编语言语句“MOVDR24, #18678H;”,会被A251编译器分解为“MOVDR24, # 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
大神,大神,谢谢大神们专业的解释。 一个0扩展,一个是1扩展
页:
[1]