找回密码
 立即注册
查看: 472|回复: 6

MOV DRk,#0DATA16 和 MOV DRk,#1DATA16 具体怎么表示?

[复制链接]
  • 打卡等级:偶尔看看I
  • 打卡总天数:11
  • 最近打卡:2025-03-21 11:14:28

13

主题

21

回帖

211

积分

中级会员

积分
211
发表于 2024-6-11 12:40:54 | 显示全部楼层 |阅读模式
MOV DRk,#0DATA16 和  MOV DRk,#1DATA16 具体怎么表示?
看数据手册中说,#0DATA16 就是把32位立即数的高位字(高16)位填“0”,#1DATA16 就是把32位立即数的高位字(高16)填“1”。

具体在汇编程序中怎么表示#0DATA16,#1DATA16

我在程序中写下面的指令,编译报错:
  1. MOV DR24,#18678H
复制代码
编译报错:main.asm(25): error A100: ILLEGAL CONSTANT VALUE




回复

使用道具 举报 送花

  • 打卡等级:偶尔看看I
  • 打卡总天数:11
  • 最近打卡:2025-03-21 11:14:28

13

主题

21

回帖

211

积分

中级会员

积分
211
发表于 2024-6-11 16:26:32 | 显示全部楼层
zh*** 发表于 2024-6-11 13:29
使用下面的指令格式:
    MOV     DR0,#00001234H
    MOV     DR4,#0FFFF5678H

试了,可以。谢谢!
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看I
  • 打卡总天数:16
  • 最近打卡:2025-04-30 08:41:32

105

主题

1215

回帖

1万

积分

荣誉版主

积分
12882
发表于 2024-6-11 23:39:56 | 显示全部楼层
本帖最后由 杨为民 于 2024-6-12 03:06 编辑
fxg2*** 发表于 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



回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看I
  • 打卡总天数:16
  • 最近打卡:2025-04-30 08:41:32

105

主题

1215

回帖

1万

积分

荣誉版主

积分
12882
发表于 2024-6-11 23:41:45 | 显示全部楼层
本帖最后由 杨为民 于 2024-6-12 02:56 编辑
zh*** 发表于 2024-6-11 13:29
使用下面的指令格式:
    MOV     DR0,#00001234H
    MOV     DR4,#0FFFF5678H

这个写法只适用于16位立即数
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看I
  • 打卡总天数:16
  • 最近打卡:2025-04-30 08:41:32

105

主题

1215

回帖

1万

积分

荣誉版主

积分
12882
发表于 2024-6-12 12:42:46 | 显示全部楼层
本帖最后由 杨为民 于 2024-6-12 12:52 编辑
zh*** 发表于 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)因此对于汇编语言语句“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 喜欢他/她就送朵鲜花吧,赠人玫瑰,手有余香!
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看I
  • 打卡总天数:11
  • 最近打卡:2025-03-21 11:14:28

13

主题

21

回帖

211

积分

中级会员

积分
211
发表于 2024-6-14 07:54:53 | 显示全部楼层
大神,大神,谢谢大神们专业的解释。
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:38
  • 最近打卡:2025-04-29 08:28:25
已绑定手机

17

主题

446

回帖

1173

积分

金牌会员

积分
1173
发表于 2024-11-13 10:27:09 | 显示全部楼层
一个0扩展,一个是1扩展
回复 支持 反对

使用道具 举报 送花

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-5-2 11:12 , Processed in 0.126489 second(s), 88 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表