【问题标题】:Assembly program refuses to accept a larger number [duplicate]汇编程序拒绝接受更大的数字[重复]
【发布时间】:2015-10-06 18:36:10
【问题描述】:

我正在尝试编写一个将 Ulam 猜想应用于数字的程序。我的程序正在运行,但是它拒绝接受数字 38836 和 38838。输入这些数字时,它给了我错误:数字超出范围再试一次。堆栈在 256 处,使用的变量是 DW 类型。我是组装的新手,所以如果我没有包含正确的信息,或者忽略了一些简单的事情,我深表歉意,但我非常卡住。以下是我认为可能与我的问题相关的内容。

            DOSSEG
            .MODEL  SMALL, BASIC, FARSTACK

            EXTRN   GETDEC:FAR
            EXTRN   NEWLINE:FAR
            EXTRN   PUTDEC:FAR
            EXTRN   PUTSTRNG:FAR

            .STACK  256


    .DATA
NUM           DW      ?
CNT           DW      0
PROMPT        DB      'Enter an integer: '
TOTAL         DB      'Number Total: '
FLOWMSG       DB      'OVERFLOW      '

       .CODE

ULAMS:                      
  MOV    AX,SEG DGROUP        
  MOV    ES,AX

    LEA      DI,PROMPT
    MOV      CX,18
    CALL     PUTSTRNG
    CALL     GETDEC

    MOV  NUM,AX
    MOV  CNT,0

    --->Rest of program cut for brevity<-----

【问题讨论】:

  • 您确定 GETDEC 允许输入如此大的数字吗?
  • “它给了我错误:NUMBER OUT OF RANGE TRY AGAIN”。我在您发布的代码中没有看到该字符串,那么该输出是从哪里来的?
  • GETDEC 是我们被告知要输入的命令,因为我们只是修改了大部分提供给我们的代码。我们目前不知道另一种收集数据的方式。 NUMBER OUT OF RANGE 发生在运行时。显示数字提示,输入像 38836 这样的数字,然后显示错误
  • GETDEC 将输入的数字放在哪里,什么时候起作用?
  • 假设一个有符号整数,16位的最大值是多少?

标签: assembly runtime large-data


【解决方案1】:

如果 GETDEC 将输入的值放入寄存器 AX,它是一个 16 位寄存器,那么您无法让 GETDEC 接受一个不适合 16 位寄存器的数字。

您将不得不设计一些其他方式来输入如此大的数字;例如,读取一个字符串并计算它所代表的数字。

【讨论】:

  • 当我在课堂上四处询问时,人们说他们对此没有意见。我认为,如果它需要按照您的建议进行一些工作,那可能会引起值得注意的回应。他们只是建议更改堆栈大小或 NUM 数据类型。也许它必须是未签名的?但是我不确定如何更改代码段以解决未签名的问题
  • 看来我需要这个程序来接受一个无符号整数,但我不知道该怎么做。如果有人可以提供一些帮助以使该程序接受无符号整数,将不胜感激
  • 也许你可以问问班上没有问题的人他们如何调用 GETDEC(或者他们是否在调用其他东西)。
  • 显然根据重复的问题,他们需要调用的函数是 getdec$ 用于无符号整数
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-22
  • 2023-03-21
  • 1970-01-01
  • 1970-01-01
  • 2011-11-01
  • 1970-01-01
相关资源
最近更新 更多