Вычислить a ^ 2 — 3b на языке ассемблера

#assembly #emu8086

#сборка #emu8086

Вопрос:

я изучал какой-то язык ассемблера, и я обнаружил проблему, которую нужно решить a^2-3b , где a> = 0 и b <= 100.
Мой первоначальный алгоритм был

 mov bl 3b 
mov cl a 
sub cl, bl 
mov dl 
  

это все, что я мог получить. Я застрял с кодами ascii для c и любыми числами, которые будут введены для a и b. Я также не смог получить a ^ 2. Итак, коды были такими

 INCLUDE 'EMU8086.INC'

.MODEL SMALL
.STACK 100H
.DATA
    MSG DB "ENTER 1ST DECIMAL NUMBER: ", 0
    
.CODE
    MOV AX, @DATA
    MOV DS, AX
    
    LEA SI, MSG
    CALL PRINT_STRING
    
    CALL SCAN_NUM     ;CX
    MOV AX,CX         ;1ST INPUT IN AX
    
    CALL PTHIS
    DB 0AH, 0DH, "ENTER 2ND DECIMAL NUMBER: ", 0
    
    CALL SCAN_NUM     ;2ND INPUT IN CX
    
    SUB AX, CX
    
    CALL PTHIS
    DB 0AH, 0DH, 0
    
    ;MOV AX, CX
    CALL PRINT_NUM    ;AX
    
    EXIT:
    MOV AH, 4CH
    INT 21H 
         
    
;.............DEFINE PROCEDURES..........;


DEFINE_PRINT_STRING 
DEFINE_PTHIS
DEFINE_GET_STRING
DEFINE_CLEAR_SCREEN
DEFINE_SCAN_NUM
DEFINE_PRINT_NUM
DEFINE_PRINT_NUM_UNS
  

может кто-нибудь сказать мне, как получить квадрат a ^ 2 или кто-нибудь может решить его, просто сообщив уравнение для a^2-3b ?
Заранее спасибо.

Комментарии:

1. Чтобы вычислить квадрат числа, используйте команду imul or mul в зависимости от того, подписано число или нет.

2. Спасибо за ваш комментарий, я думаю, число опалено

3. @MDNasirulIslam: «где a>= 0» подразумевает, что a это беззнаковое.

4. @fuz: cwd не требуется перед imul или mul . (i)mul ax всегда вычисляет ax время ax , dx регистр не используется в качестве источника.

5. @ecm Вы, конечно, правы. Понятия не имею, зачем я это ввел. Должно быть, было раннее утро.

Ответ №1:

… проблема, которую нужно решить a^2-3b , где a>=0 и b<=100 .

Ограничения a>=0 и b<=100 ничего не говорят о том, что используемые числа являются подписанными или неподписанными.


Числа со знаком (16 бит) варьируются от -32768 до 32767, но применяются ограничения
значение a варьируется от 0 до 32767
b варьируется от -32768 до 100

   mov  ax, 3
  mov  bx, [b]
  imul bx       ; -> DX:AX is 3b == [-98301,300]

  mov  bx, ax
  mov  cx, dx   ; -> CX:BX is 3b == [-98301,300]

  mov  ax, [a]
  imul ax       ; -> DX:AX is a^2 == [0,1073676289]

  sub  ax, bx
  sbb  dx, cx   ; -> DX:AX is a^2-3b == [-300,1073774590]
  

Целые числа dword со знаком варьируются от -2147483648 до 2147483647.


Числа без знака (16 бит) варьируются от 0 до 65535, но применяются ограничения
значение a варьируется от 0 до 65535
b варьируется от 0 до 100

   mov  ax, 3
  mov  bx, [b]
  mul  bx       ; -> DX:AX is 3b == [0,300]

  mov  bx, ax
  mov  cx, dx   ; -> CX:BX is 3b == [0,300]

  mov  ax, [a]
  mul  ax       ; -> DX:AX is a^2 == [0,4294836225]

  sub  ax, bx
  sbb  dx, cx   ; -> DX:AX is a^2-3b == [-300,4294836225]
  jb   Overflow ; (*)
  

Целые числа dword без знака варьируются от 0 до 4294967295 (*)