hi, next example is compiled without errors but produces wrong results due debug.
;------------------------------------------------------------ ; Test program about bug of relocatable calculations ;------------------------------------------------------------ ; allocate buffer in XDATA ?XD?BUFFER SEGMENT XDATA RSEG ?XD?BUFFER BUFFER: DS 512 ; here may be any number ;------------------------------------------------------------ ; Main program ?PR?MAIN SEGMENT CODE RSEG ?PR?MAIN ; load high byte of the buffer address +1 into accumulator MOV A,#(HIGH(BUFFER)+1) ; !!! accumulator contains high byte without +1 !!! MOV A,#(HIGH(BUFFER+256*1)) ; here we obtain the correct result JMP $ END
Hans-Bernhard Broeker, To get what was apparently intended, you would have had to write (HIGH BUFF) + 1 I have tested your suggestion and
(HIGH BUFF) + 1
MOV A,#(HIGH BUFFER) + 1
MOV A,#(HIGH(BUFFER)+1) MOV A,#(HIGH BUFFER) + 1
?XD?BUFFER SEGMENT XDATA AT 0x1100
MOV A,#(LOW(XBUF) + 1) ; line 1 MOV A,#(LOW(XBUF) OR 1) ; line 2
oops, the things are even worse:
MOV A,#(LOW(BUFFER) + 1) ; line 1 MOV A,#(HIGH(BUFFER) + 1) ; line 2
line 1 works correct Are you sure? I ask because it looks rather similar to the 3rd example under "Invalid form of simple relocatable expressions" in the manual section "Extended Relocatable Expressions" (p.97), where it says: LOW may be applied only to the final relocatable expression That seems to say that you actually have to write an equivalent of
HIGH(BUFF+0x100)
set bufoff BUFF+whatever a,#HIGH bufoff will work
It is hard to say exactly but for lines:
MOV A,#(LOW(BUFFER)+1) MOV A,#(HIGH(BUFFER)+1) JMP $
11: MOV A,#(LOW(BUFFER)+1) C:0x0000 7401 MOV A,#0x01 12: MOV A,#(HIGH(BUFFER)+1) 13: C:0x0002 7400 MOV A,#0x00 14: JMP $ C:0x0004 80FE SJMP C:0004
X:0000H SYMBOL BUFFER
Unfortunately, HIGH and LOW are not like functions you can use in your assembler code. They are instead like expression-wide modifiers that change the byte the assembler/linker view for purposes of instruction construction. For example, all of the following expressions using HIGH are evaluated to the same result:
high buffer + 1 1 + high buffer high(buffer) + 1
high buffer+256