fxg2024 发表于 2024-6-11 12:40:54

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




fxg2024 发表于 2024-6-11 16:26:32

zhp 发表于 2024-6-11 13:29
使用下面的指令格式:
    MOV   DR0,#00001234H
    MOV   DR4,#0FFFF5678H

试了,可以。谢谢!

杨为民 发表于 2024-6-11 23:39:56

本帖最后由 杨为民 于 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-11 23:41:45

本帖最后由 杨为民 于 2024-6-12 02:56 编辑

zhp 发表于 2024-6-11 13:29
使用下面的指令格式:
    MOV   DR0,#00001234H
    MOV   DR4,#0FFFF5678H
这个写法只适用于16位立即数

杨为民 发表于 2024-6-12 12:42:46

本帖最后由 杨为民 于 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

fxg2024 发表于 2024-6-14 07:54:53

大神,大神,谢谢大神们专业的解释。

bkeuqoaq 发表于 2024-11-13 10:27:09

一个0扩展,一个是1扩展
页: [1]
查看完整版本: MOV DRk,#0DATA16 和 MOV DRk,#1DATA16 具体怎么表示?