Assembly 汇编语言中算法的实现

Assembly 汇编语言中算法的实现,assembly,x86,masm,integer-division,Assembly,X86,Masm,Integer Division,我是Winx64上汇编的新程序员。我试图使用汇编编程中的基本算法设置代码,将一个数组的值除以另一个数组的值。我无法完成的实验是: 下面是我试图实现的代码(该代码放在Hyper-V虚拟机中,很抱歉我最终出现了任何糟糕的缩进): 我遇到的第一个问题是第29行有错误A2070:指令操作数无效。第二个问题是,我不确定整个代码是否正确以及错误。我相信我能够在调试器的内存中找到X和Y的值(特别是Q和R),但是我在首先汇编这段代码时遇到了困难 这里还有一个Excel,除了Q和R的预期值 好的。fuz发现的问

我是Winx64上汇编的新程序员。我试图使用汇编编程中的基本算法设置代码,将一个数组的值除以另一个数组的值。我无法完成的实验是:

下面是我试图实现的代码(该代码放在Hyper-V虚拟机中,很抱歉我最终出现了任何糟糕的缩进):

我遇到的第一个问题是第29行有错误A2070:指令操作数无效。第二个问题是,我不确定整个代码是否正确以及错误。我相信我能够在调试器的内存中找到X和Y的值(特别是Q和R),但是我在首先汇编这段代码时遇到了困难

这里还有一个Excel,除了Q和R的预期值


好的。fuz发现的问题是,我存储的商不正确

TITLE DISPLAY
      .MODEL SMALL
      .386
      .STACK
      .DATA
S     EQU 12 ;size of arrays
X     BYTE 4, 16, 100, -116, -68, -104, 125, 60, 99, 33, 55, 77
Y     BYTE 2, 3, 4, -5, -6, -7, -8, -9, -10, 11, 12, 13
Q     BYTE 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0     ;quotient = X/Y
R     BYTE 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0     ;remainder = X/Y

;Address of X is _______:_______
;Address of Y is _______:_______
;Address of Q is _______:_______
;Address of R is _______:_______

      .CODE
MAIN  PROC FAR
      .STARTUP
      ;Program
      MOV ESI, 0       ;use ESI and index to arrays
      MOV CX, S       ;counter for loop

L1:   MOV AX, 0 ;clear the AX register
      MOV AL, [X+ESI] ;load dividend
      MOV BL, [Y+ESI]
      MOV DX, 0 ;clear the DX register
      IDIV AX ;divide X by Y
      MOV [Q+ESI], AL   ;store quotient in Q
      INC ESI  ;increment index by 1
      LOOP L1
      .EXIT 
MAIN  ENDP
      END


您确定
main
应该是
proc far
?这对于masm/tasm来说是不正常的,即使是16位代码(在
.386
之前使用
.model small
)(例如)。既然您显然在编写16位代码,为什么要使用ESI而不是SI?就连你开始拍摄的图像也很明显在这样做,这对我来说毫无意义。SI是16位寻址模式的有效寄存器,但他们使用的是CX而不是ECX,因此显然他们打算使用16位模式。(32或64位更容易在64位Windows上运行)无论如何,这不是问题-一个明显的障碍是
idiv ax
将DX:ax除以ax。IDK为什么您认为BL可能是IDIV的隐式输入,但事实并非如此。此外,您需要使用
cwd
对扩展进行签名,而不是在
idiv
之前零扩展红利。因为这是.386代码,所以在将AX扩展到DX:AX之前,可以使用movsx将字节从内存加载到16位寄存器(如AX)。噢,可能是32位
mov
存储到字节数组中的错误。AL是您正在计算的16位商的8位低位的一半。顺便说一句,使用8位除法会更有意义,除非您担心
-128/-1
@JordanMeans的角盒中出现“DE”错误,否则请记住
Q
是一个字节数组,而
EAX
是一个双字。这里有一个类型不匹配。如果商适合8位,则使用
MOV[Q+ESI],AL
。否则,请适当更改数组元素的数据类型。@fuz谢谢大家!由于fuz的建议,代码的工作与预期一致!谢谢大家的帮助!谢谢你发布这个答案!这是非常宝贵的。
TITLE DISPLAY
      .MODEL SMALL
      .386
      .STACK
      .DATA
S     EQU 12 ;size of arrays
X     BYTE 4, 16, 100, -116, -68, -104, 125, 60, 99, 33, 55, 77
Y     BYTE 2, 3, 4, -5, -6, -7, -8, -9, -10, 11, 12, 13
Q     BYTE 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0     ;quotient = X/Y
R     BYTE 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0     ;remainder = X/Y

;Address of X is _______:_______
;Address of Y is _______:_______
;Address of Q is _______:_______
;Address of R is _______:_______

      .CODE
MAIN  PROC FAR
      .STARTUP
      ;Program
      MOV ESI, 0       ;use ESI and index to arrays
      MOV CX, S       ;counter for loop

L1:   MOV AX, 0 ;clear the AX register
      MOV AL, [X+ESI] ;load dividend
      MOV BL, [Y+ESI]
      MOV DX, 0 ;clear the DX register
      IDIV AX ;divide X by Y
      MOV [Q+ESI], AL   ;store quotient in Q
      INC ESI  ;increment index by 1
      LOOP L1
      .EXIT 
MAIN  ENDP
      END