这是我的程序代码,该代码将两个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
有人知道它有什么问题吗?
答案 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