我想从GPASM代码中的标签检索地址的高(超过16位)部分。
下面是我的小例子test.asm
:
LIST P=PIC18F46Q10
;LIST P=PIC18F47J13
ORG 0
MOVLW TEST_LOCATION & 0xFF
MOVWF 0x500, A
MOVLW (TEST_LOCATION >> 8) & 0xFF
MOVWF 0x501, A
MOVLW (TEST_LOCATION >> 16) & 0xFF
MOVWF 0x502, A
JUST_LOOP
BRA JUST_LOOP
ORG 0x12468
TEST_LOCATION
DB 0xDE, 0xAD, 0xBE, 0xEF
END
此代码的目的是将TEST_LOCATION
(0x12468
)的地址存储到RAM的某个部分。
汇编程序版本:
D:\Temp>gpasm -v
gpasm-1.5.2 #1325 (Jan 30 2022)
装配命令:
gpasm test.asm
以下是生成的test.lst
的一部分:
LOC OBJECT CODE LINE SOURCE TEXT
VALUE
00001 LIST P=PIC18F46Q10
00002 ;LIST P=PIC18F47J13
00003
000000 00004 ORG 0
00005
000000 0E68 00006 MOVLW TEST_LOCATION & 0xFF
Message[1302]: RAM Bank undefined in this chunk of code. Ensure that bank bits are correct. Assuming bank 5 from now on.
000002 6E00 00007 MOVWF 0x500, A
000004 0E24 00008 MOVLW (TEST_LOCATION >> 8) & 0xFF
000006 6E01 00009 MOVWF 0x501, A
000008 0E00 00010 MOVLW (TEST_LOCATION >> 16) & 0xFF
00000A 6E02 00011 MOVWF 0x502, A
00012
00000C 00013 JUST_LOOP
00000C D7FF 00014 BRA JUST_LOOP
00015
012468 00016 ORG 0x12468
012468 00017 TEST_LOCATION
Warning[220]: Address exceeds maximum range for this processor. BADROM_START: 0x010000 <= Bad address: 0x012468 <= BADROM_END: 0x30FFFF
Warning[220]: Address exceeds maximum range for this processor. BADROM_START: 0x010000 <= Bad address: 0x012469 <= BADROM_END: 0x30FFFF
Warning[220]: Address exceeds maximum range for this processor. BADROM_START: 0x010000 <= Bad address: 0x01246A <= BADROM_END: 0x30FFFF
Warning[220]: Address exceeds maximum range for this processor. BADROM_START: 0x010000 <= Bad address: 0x01246B <= BADROM_END: 0x30FFFF
012468 ADDE EFBE 00018 DB 0xDE, 0xAD, 0xBE, 0xEF
00019
00020 END
您可以看到,地址0x12468
的中间部分0x24
和较低部分0x68
正确嵌入到指令中,但较高部分0x01
没有嵌入,而是存储了零。
我想这可能是因为选择了PIC18F46Q10
,它有64k字节的程序ROM,而0x12468
没有存储空间,所以我尝试切换到PIC18F47J13
,它有128k字节的程序ROM。但是,高部分仍然被嵌入为零。
此情况下得到的test.lst
的一部分:
LOC OBJECT CODE LINE SOURCE TEXT
VALUE
00001 ;LIST P=PIC18F46Q10
00002 LIST P=PIC18F47J13
00003
000000 00004 ORG 0
00005
000000 0E68 00006 MOVLW TEST_LOCATION & 0xFF
Message[1302]: RAM Bank undefined in this chunk of code. Ensure that bank bits are correct. Assuming bank 5 from now on.
000002 6E00 00007 MOVWF 0x500, A
000004 0E24 00008 MOVLW (TEST_LOCATION >> 8) & 0xFF
000006 6E01 00009 MOVWF 0x501, A
000008 0E00 00010 MOVLW (TEST_LOCATION >> 16) & 0xFF
00000A 6E02 00011 MOVWF 0x502, A
00012
00000C 00013 JUST_LOOP
00000C D7FF 00014 BRA JUST_LOOP
00015
012468 00016 ORG 0x12468
012468 00017 TEST_LOCATION
012468 ADDE EFBE 00018 DB 0xDE, 0xAD, 0xBE, 0xEF
00019
00020 END
要使用gpasm从标签TEST_LOCATION
中获取地址0x01
的高位部分,我应该做些什么?
直接编写0x01
而不使用TEST_LOCATION
可能是一种变通方法,但看起来不太好。
2条答案
按热度按时间k4ymrczo1#
如果使用提供的运算符,则可以获得地址的字节数:
v09wglhw2#
根据gpasm的规范,移位宽度
16
被解释为在十进制中具有值22的十六进制数。可以使用十进制数来固定表达式
或使用十六进制数