我正在学习一些汇编语言。我找到了要解决的问题
a^2-3b
其中 a>=0 且 b<=100.
我最初的算法是:
mov bl 3b
mov cl a
sub cl, bl
mov dl
这是我所能得到的。我对 c 的 ASCII 代码以及为 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
的解决方案来解决它?
...要解决的问题
,其中a^2-3b
和a>=0
。b<=100
约束
a>=0
和 b<=100
没有告诉任何有关数字是 signed 或 unsigned 的信息。
有符号数字(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]
有符号双字整数范围从 -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 ; (*)
无符号双字整数范围从 0 到 4294967295 (*)