num1 dq 1234567812345678h
num2 dq 1234567854636732h
num3 dq ?
это говорит об ошибке при определении моих переменных
Тот факт, что вы разбиваете вычисления на 16-битные блоки, не слишком хорошо совпадаетс возможностью указывать 64-битное значение в директиве dq
.Я мог бы даже предположить, что директива dq
вообще не будет доступна.
Вы всегда можете указать эти большие 64-битные числа, используя их составляющие меньшие части.Вам просто нужно знать, что X86 - это архитектура с прямым порядком байтов, и поэтому наименее значимая часть числа идет по младшему адресу памяти:
Использование байт размерных частей:
12_34_56_78_54_63_67_32h
^ least significant part
num2 db 32h, 67h, 63h, 54h, 78h, 56h, 34h, 12h
^ lowest memory address
Использование слово размер порции:
1234_5678_5463_6732h
^ least significant part
num2 dw 6732h, 5463h, 5678h, 1234h
^ lowest memory address
В вашей программе это становится:
num1 dw 5678h, 1234h, 5678h, 1234h
num2 dw 6732h, 5463h, 5678h, 1234h
num3 dw 4 dup 0
Ваше добавление работает, но это не обязательноиспользовать столько регистров.Вы можете легко закодировать эту задачу, используя один регистр:
mov ax, num1
add ax, num2
mov num3, ax
mov ax, num1+2
adc ax, num2+2
mov num3+2, ax
mov ax, num1+4
adc ax, num2+4
mov num3+4, ax
mov ax, num1+6
adc ax, num2+6
mov num3+6, ax
Теперь это требует некоторого цикла.
mov bx, offset num1 ;num1, num2, and num3 are consecutive in memory
clc ;Because there's no simple ADD first
More:
mov ax, [bx] ;Load word from num1
adc ax, [bx+8] ;Plus word from num2
mov [bx+16], ax ;Store in word from num3
add bx, 2 ;Go to next word
cmp bx, num2 ;num2 immediately follows num1 in memory
jb More