assembly 如何从gpasm中的标签获取地址的高位(超过16位)部分

g2ieeal7  于 2023-03-02  发布在  其他
关注(0)|答案(2)|浏览(145)

我想从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_LOCATION0x12468)的地址存储到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可能是一种变通方法,但看起来不太好。

k4ymrczo

k4ymrczo1#

如果使用提供的运算符,则可以获得地址的字节数:

MOVLW LOW TEST_LOCATION
    MOVWF 0x500, A
    MOVLW HIGH TEST_LOCATION
    MOVWF 0x501, A
    MOVLW UPPER TEST_LOCATION
    MOVWF 0x502, A
v09wglhw

v09wglhw2#

根据gpasm的规范,移位宽度16被解释为在十进制中具有值22的十六进制数。
可以使用十进制数来固定表达式

MOVLW (TEST_LOCATION >> D'16') & 0xFF

或使用十六进制数

MOVLW (TEST_LOCATION >> 0x10) & 0xFF

相关问题