使用汇编语言将两个8字节数字相加

时间:2018-11-10 17:30:16

标签: assembly emu8086

这是我的程序代码,该代码将两个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 :(得分:1)

num1 dq 1234567812345678h
num2 dq 1234567854636732h
num3 dq ?
     

它说定义我的变量有误

将计算拆分为16位的事实与在dq指令中指定64位立即数的能力不太匹配。我什至可以想象dq指令根本不可用。

您始终可以使用组成较小的部分来指定那些较大的64位数字。您只需要知道X86是一点点字节序体系结构,因此,数字的最低有效部分进入了最低的内存地址:

使用 byte 个大小部分:

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