Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly ,从您开始使用指针的那一刻起,这种优势就消失了,并且由于给出的原因,结构变得更加高效。想一想在并行数组上使用指针需要做些什么——我想,这就是他的意思。当然,好吧,但当我们讨论优势与劣势时,可以说讨论应该是“在无法使用之前使用最有效的方法”,这基本上意味着“_Assembly_6502 - Fatal编程技术网

Assembly ,从您开始使用指针的那一刻起,这种优势就消失了,并且由于给出的原因,结构变得更加高效。想一想在并行数组上使用指针需要做些什么——我想,这就是他的意思。当然,好吧,但当我们讨论优势与劣势时,可以说讨论应该是“在无法使用之前使用最有效的方法”,这基本上意味着“

Assembly ,从您开始使用指针的那一刻起,这种优势就消失了,并且由于给出的原因,结构变得更加高效。想一想在并行数组上使用指针需要做些什么——我想,这就是他的意思。当然,好吧,但当我们讨论优势与劣势时,可以说讨论应该是“在无法使用之前使用最有效的方法”,这基本上意味着“,assembly,6502,Assembly,6502,,从您开始使用指针的那一刻起,这种优势就消失了,并且由于给出的原因,结构变得更加高效。想一想在并行数组上使用指针需要做些什么——我想,这就是他的意思。当然,好吧,但当我们讨论优势与劣势时,可以说讨论应该是“在无法使用之前使用最有效的方法”,这基本上意味着“在无法使用并行数组之前首选并行数组”。否则,如果建议是“使用指针和结构数组而不是并行数组”,那么20次中有19次你编写的代码更多而效率更低。这一点,我完全同意。如何lda(zeropagedamgelist),y优于加载非zeropagedam


,从您开始使用指针的那一刻起,这种优势就消失了,并且由于给出的原因,结构变得更加高效。想一想在并行数组上使用指针需要做些什么——我想,这就是他的意思。当然,好吧,但当我们讨论优势与劣势时,可以说讨论应该是“在无法使用之前使用最有效的方法”,这基本上意味着“在无法使用并行数组之前首选并行数组”。否则,如果建议是“使用指针和结构数组而不是并行数组”,那么20次中有19次你编写的代码更多而效率更低。这一点,我完全同意。如何
lda(zeropagedamgelist),y
优于
加载非zeropagedamagelist,x
?后者为5个周期,前者为6个周期,后者不需要设置,前者需要设置。我想我不明白你的答案。也许您假设数据在运行时加载到任意位置?但这不是人们编写6502应用程序的方式。你可以加载新的零页指针,对于你达到的每一个“级别”,你进入的每一个新地牢等等。但这是一个好的观点,我会相应地改变我的答案。问题是X和Y寄存器是8位的,不能用作结构元素的索引。这个Q听起来太普通了。如果您的任务允许的话,还有更多选项可以选择如何硬编码某些技巧,不幸的是,我不熟悉6502,Z80+x86差异太大,但有时我们会在内存中交错结构,因此每个元素位于+256地址(通过增加ptr的上8位来移动指针),或者元素有固定的大小,指针在处理过程中部分递增,以越过每个字段,并在下一个元素的开始处结束指向,或者将元素的大小固定为2的幂,因此乘法仅为移位,等等……当我上次为C64实现光栅IRQ表时,我为下一条光栅线使用了一组结构化数据来设置IRQ和要跳转到的ISR有效载荷。这更简单,没有任何缺点,因为数据仅以线性顺序使用。也就是说,我想不出结构化数据的一般优势。这实际上取决于用例。
ldx itemNdx
lda Monster_hitPoints,x   ; access hitpoints
...
lda Monster_damage,x      ; access damage
...
lda Monster_shieldLevel,x ; access shieldLevel
...
lda Monster_nameLow,x     ; access name
sta pageZeroStringPointer
lda Monster_nameHigh,x
sta pageZeroStringPointer + 1
ldy #0
lda (pageZeroStringPointer),y
lda itemNdx
clc          ; have to compute offset
asl a        ; a = itemNdx * 2   
asl a        ; a = itemNdx * 4
adc itemNdx  ; a = itemNdx * 5
tax          ; x = itemNdx * 5 

lda s_monsters+Monster.hitPoints,x   ; access hitpoints
...
lda s_monsters+Monster.damage,x      ; access damage
...
lda s_monsters+Monster.shieldLevel,x ; access shieldLevel
...
lda s_monsters+Monster.name,x        ; access name
sta pageZeroStringPointer
lda s_monsters+Monster.name+1,x
sta pageZeroStringPointer + 1
ldy #0
lda (pageZeroStringPointer),y        ; a is now first char of name
 txa
 clc
 adc #sizeof(Monster)
 tax
; setup pointer
lda itemNdx
ldx #sizeof(Monster)
jsr multiplyAX       ; 8->16 bit multiply is around 70 cycles result in A(low), X(high)
clc
adc #s_monster && 0xFF
sta POINTER
txa
adc #s_monster >> 8
sta POINTER + 1

ldy #Monster.hitPoints   ; access hitpoints
lda (POINTER),y   
...
ldy #Monster.damage      ; access damage
lda (POINTER),y 
...
ldy #Monster.shieldLevel ; access shieldLevel
lda (POINTER),y 
...
ldy #Monster.name       ; access name
lda (POINTER),y
sta pageZeroStringPointer
ldy #Monster.name+1    
lda (POINTER),y
sta pageZeroStringPointer + 1
ldy #0
lda (pageZeroStringPointer),y        ; a is now first char of name
;  Assuming MONSTER_PTR is zp, set to the start of the current structure
ldy  #Monster.hitPoints
lda  (MONSTER_PTR),y
...
ldy  #Monster.damage
lda  (MONSTER_PTR),y
; set up zero page, done only once per level
; (per level, per stage, per dungeon, whatever)

lda #<monster_HP_list_for_this_level
sta $f0
lda #>monster_HP_list_for_this_level
sta $f1

lda #<monster_damage_list_for_this_level
sta $f2
lda #>monster_damage_list_for_this_level
sta $f3

lda #<monster_shield_list_for_this_level
sta $f4
lda #>monster_shield_list_for_this_level
sta $f5

...

; here you'd have instant access to the monster's values :
lda ($F0),y   ; monster Nr. y's HP
; or 
lda ($F4),y   ; monster Nr. y's Shield level