Assembly low()和high()函数在AVR中是如何工作的

Assembly low()和high()函数在AVR中是如何工作的,assembly,avr,Assembly,Avr,我试图理解一些汇编代码,但不理解如何找到一些值。如果代码: ldi ZL, low(2*table) ldi ZH, high(2*table) 与表一起执行: table: .db 32, 34, 36, 37, 39, 41, 43, 45, 46, 48, 50, 52, 54, 55, 57, 59, 61, 63, 64, 66 我在看表中的元素5,41 本地设计院(ldi)运营商在本例中做什么?在执行第一个本地设计院(ldi)后,

我试图理解一些汇编代码,但不理解如何找到一些值。如果代码:

ldi     ZL, low(2*table)        
ldi     ZH, high(2*table)
与表一起执行:

table:      .db     32, 34, 36, 37, 39, 41, 43, 45, 46, 48, 50, 52, 54, 55, 57, 59, 61, 63, 64, 66
我在看表中的元素5,41

本地设计院(ldi)运营商在本例中做什么?在执行第一个本地设计院(ldi)后,14存储在ZL位置的SRAM中,但为什么是14


执行第二个后,02存储在ZH位置。

闪存是字寻址的,汇编程序标签表以字给出了表的地址。*2以字节为单位给出正确的地址。我更喜欢使用它,它与您的表格内容无关。它加载的基址显然是0x020e。所以这个值来自表值的存储位置,而不是基于表值本身?这是正确的。加载表地址乘以2的目的是什么?@ndim:我认为这对于AVR来说是正常的;由于某些原因,标签地址是字号,您需要缩放以获得字节地址。对我来说似乎完全疯了,但我想我以前见过这个。虽然这对于代码地址可能有意义,但若指令是对齐的,那个么字节对齐的地址是什么意思?我想table会用文字给你地址,例如记忆中的第10个单词,你需要@PeterCordes我想:你真是太圆滑了!当然你是对的,我会马上修改我的答案。我必须为自己在某些事情上的错误敞开大门,因为我所知道的关于AVR的一切都是基于看到了这么多关于AVR的问题,偶尔出于好奇而在谷歌上搜索。地址缩放似乎是一个奇怪的设计选择,没有多大意义。但是,是的,我花了几次努力来表达我的理解,这就是我决定的P
    ldi ZL, low(table << 1)  ; (or you could use `table * 2`)
    ldi ZH, high(table << 1) ; Z Register points to start of table
    ldi r25, 5               ; register r25 contains required offset in table
    clr r1                   ; (I always have r1 set to zero all the time)
    add ZL, r25              ; add offset to base pointer
    adc ZH, r1               ; if the low byte of the Z register "pointer"
                             ; overflowed, add the carry flag to the high byte
    lpm r24, Z               ; read the 5th element of the table into r24