Реализация арифметики c в сборке - PullRequest
1 голос
/ 13 марта 2020

Я новый программист для сборки на Winx64. Я пытаюсь настроить код, который делит значения одного массива на значения другого, используя базовые значения c arithmeti c из программирования на ассемблере. Лаборатория, которую я не смог закончить sh, такова:

enter image description here

Вот код, который я пытался реализовать (который был помещен в Hyper- V Виртуальная машина, извините за любые плохие отступы, которые у меня заканчиваются):

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], EAX    ;store quotient in Q
      INC ESI  ;increment index by 1
      LOOP L1
      .EXIT 
MAIN  ENDP
      END

Первая проблема, с которой я столкнулся, заключается в том, что в строке 29 есть ошибка A2070: недопустимые операнды инструкций. Вторая проблема заключается в том, что я не уверен, что весь код верен вместе с ошибкой. Мне кажется, я могу найти значения X и Y (особенно не Q и R) в памяти отладчика, но у меня возникают проблемы при сборке этого кода в первую очередь.

Здесь также есть Excel, кроме с ожидаемыми значениями для Q и R.

enter image description here

1 Ответ

1 голос
/ 21 марта 2020

Alrighty. Проблема, обнаруженная 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

...