【问题标题】:Adding two 8 byte numbers using assembly language使用汇编语言添加两个 8 字节数字
【发布时间】:2018-11-10 17:30:15
【问题描述】:

这是我添加两个 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 

有人知道它有什么问题吗?

【问题讨论】:

  • 您可以改用两个dd 指令。请记住,8086 是一种小端架构,因此最不重要的 dword 排在最前面。
  • 如果我使用两个 dd 指令,我将无法将加法的结果保存在一个变量中..
  • 汇编中没有变量,只有内存。无论您是通过单个dq 还是通过两个dd 保留8 个字节,都将在内存中定义相同的8 个字节。像num1 这样的标签是指向内存中第一个字节的内存“书签”,它们不是像保存某种类型或保护某些东西那样的“变量”,只是您可以随意使用的内存地址。所以在汇编dq 123456789ABCDEF0h = dd 9ABCDEF0h, 12345678h 中,生成的机器代码是相同的。 (MASM 确实在一定程度上保护了标签的“类型”,但这是 x86 可用的 20 个汇编程序中的单个汇编程序,所以谁在乎……)
  • Tania,请编辑问题以添加回答问题所需的所有信息信息 - 您评论中的错误消息以及您正在使用的汇编程序。
  • 是的,这个问题实际上很合理,你能提供额外的细节吗,尤其是在汇编中可以让整个世界变得不同......你可能想阅读minimal reproducible example并通过它来解决你的问题.

标签: assembly emu8086


【解决方案1】:
num1 dq 1234567812345678h
num2 dq 1234567854636732h
num3 dq ?

它说定义我的变量时出错

您将计算拆分为 16 位块的事实与在 dq 指令中指定 64 位立即数的能力不太匹配。我什至可以想象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

使用 word 大小的部分:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-07-03
    • 2018-12-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-04
    • 1970-01-01
    相关资源
    最近更新 更多