【问题标题】:Negative Numbers MASM Input and Output负数 MASM 输入和输出
【发布时间】:2016-11-29 16:50:04
【问题描述】:

我正在 MASM x8086 中编写一个字节大小的多导数应用程序,它必须能够接收负系数。

我知道二进制可以用有符号和无符号形式表示。但我正在寻找一种接收有符号整数的方法,这样我就可以避免另一个数组。或者有没有办法将我的变量定义为有符号整数?

以下是我的整数输入程序。

TEN db 10  ;;; constant
num db ?   ;;; coefficient
           ;;; bh is the degree

get_int PROC
  lea si, string     ; replaces the ? in the string with the degree
  add si, 13h
  mov dl, bh
  add dl, 30h
  mov [si], dl

  mov ah, 09h
  lea dx, string     ; prompt
  int 21h

  mov ah, 0Ah
  lea dx, buffString ; user input
  int 21h

  lea si, buffString ; point to count byte
  inc si

  mov ch, 00h        ; cx = count
  mov cl, [si]

  add si, cx         ; si points to end of string

  mov dl, 00h        ; hold result(dl)
  mov bl, 01h        ; hold 10^x (bl)

loop1:
  mov al, [si]       ; prep for char ---> number conversion
  cmp al, '-'
  je negativeSign

  sub al, 30h        ; convert
  mul bl             ; ax = al*bl
  add dl, al         ; sum of results

  mov al, bl         ; preload for instruction
  mul TEN            ; TEN is variable predefined as 10
  mov bl, al
  jmp overNegative
negativeSign:

  mov dh, 00h
  mov [si], dh
overNegative: 
  dec si
  loop loop1         ; loop instruction uses cx as index counter once zero breaks

  mov num, dl
  ret 
get_int ENDP
; output is num

【问题讨论】:

  • 这其中的c++ 部分到底是什么?
  • 删除了标签。没有 C++。
  • 你在哪里处理'-'字符?你使用“双补码”吗?
  • 我刚刚将我对“-”字符的测试添加到提供的代码中,现在我可以用正确的输出处理负输入,而没有负号。我了解什么是二进制补码,但不知道如何应用它。最好在我的 if else 语句中应用签名标志,然后在输出之前测试该标志?
  • 我不明白这个问题。您声称知道有符号整数和无符号整数的二进制表示之间没有区别。那是对的。如果您将整数值解释为“有符号”,则高位是符号位:如果它是负数,则打开,如果它是正数,则关闭。否则,如果您将整数值解释为“无符号”,则高位只是存储数值数据的另一个位,从而增加了其总范围。因此,在汇编语言中询问“接收”有符号或无符号整数是绝对没有意义的。重要的是你如何解释指定的参数。

标签: masm x86-16 dos signed


【解决方案1】:

当您在解释输入时偶然发现“-”字符时,这是一个保存假设,即您到达了数字的开头。因此,您应该跳出循环。我认为用零替换“-”字符没有任何意义!

你需要做的是取反数字以获得正确的签名结果:

loop1:
 mov al, [si]       ; prep for char ---> number conversion
 cmp al, '-'
 je negativeSign

 sub al, 30h        ; convert
 mul bl             ; ax = al*bl
 add dl, al         ; sum of results

 mov al, bl         ; preload for instruction
 mul TEN            ; TEN is variable predefined as 10
 mov bl, al
 dec si
 loop loop1         ; loop instruction uses cx as index counter once zero breaks

 mov num, dl        ;Positive number [0,127]
 ret 

negativeSign:
 mov dh, 00h        <<<<<<< Need this as a flag?
 neg dl
 mov num, dl        ;Negative number [-128,-1]
 ret

【讨论】:

  • 一个更好的算法是total = total*10 + digit;只需要在循环内进行一次乘法。请参阅NASM Assembly convert input to integer? 以获取 x86-64 示例(我们甚至可以使用 LEA 进行移位和加法,甚至不需要单独的 imul 指令)。但是,是的,围绕未签名的转换处理领先的- 是可行的方法。
猜你喜欢
  • 2021-06-11
  • 2016-06-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-28
  • 2015-06-12
  • 1970-01-01
相关资源
最近更新 更多