[uquote="Engineer_Keen",url="/forum/viewtopic.php?p=3125552#p3125552"]X,Y,Z - существующие регистровые пары (R26-R31 или XH,XL,YH,YL,ZH,ZL),...
...более осмысленное имя для переменной (ну или константы...[/uquote]
А где Вы видите в моем примере использование старших регистров R26-R31?
Осмысленные имена... Так и поступаю. Здесь "Y" вписал лишь для краткости.
А константы... В процессе работы программы значение переменной, которую пытаюсь отправить в регистры, постоянно меняется.
[uquote="Engineer_Keen",url="/forum/viewtopic.php?p=3125552#p3125552"]Тут не понятно что конкретно нужно получить и как данные расположены. Например, имея 3 байта подряд можно выгадать 1 слово в программной памяти, используя ST X+,rn с предварительной загрузкой регистровой пары XH:XL начальным адресом (STS занимает 2 слова, а ST одно, но нужно потратить еще пару на LDI). Для оптимизации такого места нужно видеть весь код.[/uquote]
В Ассемблере у меня не то что первые шаги, а поползновения

Так что с понятием "память" и использованием директив мне еще потеть и пыхтеть.
Вот рабочий код, с ручной подстановкой данных (а-ля константа):
Спойлер
Dim tmp1 As Byte
Dim tmp2 As Byte
'data = 16 [$0010] 1-ый множитель
'koef = 2489 [$09B9] 2-ой множитель
'temp = 39824 [$9B90] -> ожидаемый результат
!.def dataL = R4 ; $10 - младший разряд
!.def dataH = R5 ; $00 - старший разряд
!.def koefL = R2 ; $B9 - младший разряд
!.def koefH = R3 ; $09 - старший разряд
!.def tmp1 = R16 ; $90 - младший разряд
!.def tmp2 = R17 ; $9B - старший разряд
!ldi R24 , $10
!mov R4 , R24
!ldi R24 , $00
!mov R5 , R24
!ldi R24 , $b9
!mov R2 , R24
!ldi R24 , $09
!mov R3 , R24
!clr tmp2 ; очищаем старший разряд R18
!mul dataL , koefL ; умножаем младшие разряды => R4 * R2 => $09 * $13 = $AB => копируем в R0,R1
!mov tmp1 , R0 ; копируем R0 в мл. разр. результата R16 => $AB => R16
!mov tmp2 , R1 ; копируем R1 в ср. разр. результата R17 => $00 => R17
!mul dataH , koefL ; умножаем старший на младший => R5 * R2 => $01 * $13 = $13 => копируем в R0,R1
!add tmp2 , R0 ; складываем R17 и R0 => $00 + $13 = $13 => R17
!mul dataL , koefH ; умножаем младший на старший => R4 * R3 => $09 * $01 = $09 => копируем в R0,R1
!add tmp2 , R0 ; складываем R17 и R0 => $13 + $09 = 1C => R17
!mul dataH , koefH ; умножаем старший на старший => R5 * R3 => $01 * $01 = $01 => копируем в R0,R1
!sts {tmp1} , tmp1
!sts {tmp2} , tmp2
Dim tmp4 As String * 6
Dim tmp5 As Word
tmp4 = Hex(tmp2)
tmp4 = tmp4 + Hex(tmp1) ' $9B90
tmp5 = HexVal(tmp4) ' 39824
Результат разнесен по регистрам R16,R17. Их то я и вытаскиваю директивой STS и форматирую последними тремя строками. Это извлечение можно выполнить менее емким кодом?
По поводу переменной... Перед ASM-блоком разбил число поразрядно и пытался впихнуть в регистры (оба разряда тут присвоены одной переменной - это лишь для попытки "пропихивания")
Код: Выделить всё
Dim Y As String * 2
X = 2489
Y = Hex(High(X)) ' -> 09
Y = Hex(Low(X)) ' -> b9
Проблемка в том, что куда-то не туда увели меня танцы - 16-ричные результаты смог получить лишь для переменной String

. В чем ошибка? Но полный тупик даже не в этом. В регистры пытался отправлять переменную ВСЕХ типов - и Ворд, и Лонг, и Байт,... Один ответ у Баскома - 222-ая ошибка.