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
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