Добавление двух 8-байтовых чисел на ассемблере - PullRequest
0 голосов
/ 10 ноября 2018

Это мой код для программы, которая добавляет два 8-байтовых числа.

.model small 
.100h 
.data
num1 dq 1234567812345678h
num2 dq 1234567854636732h
num3 dq ?
.code
mov ax,@data
mov ds,ax
mov ax,num1
add ax,num2
mov bx,num1+2
adc bx,num2+2
mov cx,num1+4
adc cx,num2+4
mov dx,num1+6
adc dx,num2+6

mov num3,ax
mov num3+2,bx
mov num3+4,cx
mov num3+6,dx 

end

Почему-то говорится, что при определении моих переменных произошла ошибка:

(3) illegal instruction: num1 dq 1111111123145678h or wrong parameters. 
(4) illegal instruction: num2 dq 1111111123145678h or wrong parameters. 
(5) illegal instruction: num3 dq ? or wrong parameters. 
(9) wrong parameters: MOV ax,num1 
(9) probably no zero prefix for hex; or no 'h' suffix; or wrong addressing; or undefined var: num1 

Кто-нибудь имеет представление о том, что с ним не так?

1 Ответ

0 голосов
/ 11 ноября 2018
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
...