【问题标题】:In Assembly, How do i get past the -128 to 127 range?在组装中,我如何超越 -128 到 127 的范围?
【发布时间】:2014-11-12 01:35:37
【问题描述】:

所以我在 .bss 中有这个声明

answer resb 1

作为答案,我存储从 -99 到 +99 的 2 位整数之和的结果。当我尝试添加 +99 和 +99 时,答案是否定的。 -128 到 127 范围内的任何答案都被正确输入。如何解决此上溢/下溢问题?

我刚开始使用汇编编码,所以请帮助我理解这个问题。我尝试将 resb 设为 resw,但我的代码在运行时只产生了“浮点错误”,因此我恢复使用 resb。

我如何打印答案

;ansh,anso,anst are all declared as resb 1 in .bss
print_answer: ;tens1 holds the answer always
;getting each digit of tens2 to be converted as char    
mov al,[answer]
mov bl,100
div bl

mov [ansh],al ; holds tens digit of average
mov [anst],ah

mov ah,0
mov al,[anst]
mov bl,10
div bl

mov [anst],al
mov [anso],ah

add byte[ansh],30h
add byte[anst],30h
add byte[anso],30h

;printing routine follows here

【问题讨论】:

  • 使用更大的数据类型。
  • .. 表示 16 位或 32 位寄存器和内存操作数。

标签: assembly integer-overflow underflow


【解决方案1】:

添加 -99 和 +99 在 8 位寄存器中应该可以正常工作。如果不正确,则可能是添加没有正确完成,或者结果显示处理不当。

一个常见的显示错误是使用 8 位结果调用库函数,但将其传递给需要 16 位(或更宽)值的函数。在创建要传递给库函数的值时,请务必屏蔽或清零您未生成的位。

当加倍 +99 时,结果当然大于 127,因此您要么必须将结果作为无符号 8 位值处理,要么将其扩展为更宽的值。您如何查看结果?

【讨论】:

  • 添加 +99 和 -99 效果很好,但 +99 和 +99 不像我在问题中所说的那样。
  • @nowrn29:哦,对不起!我巧妙地错过了,并修改了我的答案。
  • 首先我将答案除以 100,然后将答案存储为百位数,然后将该运算的余数除以 10,并将答案存储为十位数,余数存储为个位数.至于答案的符号,我有一个条件语句来检查它。我将编辑我的帖子并显示它。
  • 如何将其扩展到更广泛的价值?
猜你喜欢
  • 2013-02-26
  • 1970-01-01
  • 1970-01-01
  • 2022-01-21
  • 2014-01-20
  • 1970-01-01
  • 2023-03-31
相关资源
最近更新 更多