Код, который вы написали, делает не то, что вы думаете. p
— это просто определенное имя для числа $205
. По сути, ваша программа
LDA #$01
; define p $0205
STA $0205
INC $0205
STA $0205
Инструкция INC
увеличивает содержимое ячейки $0205
, но затем она немедленно перезаписывается второй STA
.
Есть несколько способов сделать то, что вы хотите. Во-первых, если это всегда место p
и следующее, в зависимости от вашего ассемблера, вы должны написать
LDA #$01
define p $0205
STA p
STA p+1
Это поместит 1 в $0205
и $0206
. В качестве альтернативы, если вы хотите выполнять приращение во время выполнения, используйте индексный регистр, из которых есть два X
и Y
.
LDA #$01
define p $0205
LDY #0
STA p,Y
INY
STA p,Y
Это не лучше, чем предыдущее, но его можно использовать в цикле.
define p $0205
define count 10
LDA #$01
LDY #count
loop:
DEY ; Decrement Y by 1 setting the zero flag if zero
STA p,Y ; Store the result in p + Y (flags are unaffected)
BNE loop ; Go round the loop if the zero flag is not set
Приведенный выше код заполнит ячейки от p до p + 9 константой 1. Обратите внимание, что он делает это, перемещаясь вниз по памяти.
Если p
неизвестно до времени выполнения, вы можете сделать то же самое, но используя косвенный адрес нулевой страницы.
define p $0205
define count 10
define ptr $50 ; A random zero page location
LDA #$01
LDY #count
; First load the address in the zero page location
LDA <p ; < is a common notation for the low byte of a 16 bit number ($05 in this case)
STA ptr
LDA >p ; and > is for the high byte ($02 in this case)
STA ptr+1
; Now a similar loop to before
loop:
DEY ; Decrement Y by 1 setting the zero flag if zero
STA (ptr),Y; Store the result in p + Y (flags are unaffected)
BNE loop ; Go round the loop if the zero flag is not set
person
JeremyP
schedule
02.01.2019
p
, что равно $0205. Вы никогда не получали доступ к $0206. - person Raymond Chen   schedule 26.12.2018INC p
, увеличивает память на 0205? Он не может увеличивать p, так как это всего лишь идея, а не значение в памяти или регистре. - person ctrl-alt-delor   schedule 26.12.2018sta p
/sta p+1
, потому чтоp
- это только константа времени сборки. - person Peter Cordes   schedule 26.12.2018movsx
иmovzx
для расширения знака / нуля в регистры, отличные от AX, и умножать на/из любого регистра (например,imul ebp, dword [rdi+rax*4], 12345
), регистры x86 являются плоскими/ортогональными для большинства целей. Инструкцияloop
устарела, поэтому осталось только несколько вещей с фиксированным регистром: счетчики сдвига в CL (исправлено BMI2shlx
/shrx
) и целочисленное деление. Вывод компилятора x86-64 не заполненmov reg,reg
из-за специальных регистров. - person Peter Cordes   schedule 03.01.2019mov
инструкций, но это потому, что целочисленные инструкции имеют 2 операнда с деструктивным dst/src. Не из-за специальных регистров.lea
- это обходной путь для сдвига и добавления. ISA с тремя операндами, скорее всего, была бы более эффективной, но с проблемами x86 можно справиться до тех пор, пока ее не заменит что-то лучшее. У него довольно хороший набор инструкций SIMD, особенно с AVX512, заполняющим многие пробелы. У ARM нет эффективной векторной > целочисленной маски (pmovmskb
), поэтому сложно писать циклы поиска ARM SIMD, но в остальном NEON подходит. - person Peter Cordes   schedule 03.01.2019