【问题标题】:Compute a^2 - 3b in assembly language用汇编语言计算 a^2 - 3b
【发布时间】:2020-09-25 09:41:44
【问题描述】:

我正在研究一些汇编语言,我发现了一个要解决的问题 a^2-3b 其中 a>=0 和 b 我最初的算法是

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 的方程来解决它? 提前致谢。

【问题讨论】:

  • 要计算数字的平方,根据数字是否有符号使用imulmul 指令。
  • 感谢您的评论,我猜这个号码已经被烧掉了
  • @MDNasirulIslam:“其中 a>=0”意味着 a 未签名。
  • @fuz: 在imulmul 之前不需要cwd(i)mul ax 总是计算 axaxdx 寄存器不用作源。
  • @ecm 你当然是对的。不知道我为什么把它放进去。一定是一大早。

标签: assembly emu8086


【解决方案1】:

...解决a^2-3b 的问题,其中a>=0b<=100

约束 a>=0b<=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]

有符号 dword 整数范围从 -2147483648 到 2147483647。


无符号数字(16 位)范围从 0 到 65535,但应用约束
a 范围从 0 到 65535
b em> 范围从 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 (*)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-11-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多