#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
ormul
в зависимости от того, подписано число или нет.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 (*)