【问题标题】:Division in 8086 Assembly in MASM [duplicate]MASM中的8086大会中的划分[重复]
【发布时间】:2014-02-09 07:39:24
【问题描述】:

我正在用 8086 编写这个汇编程序,但它不能正常工作。即使我使用单个数字,商和余数也会打印为一些随机符号。有人可以指出程序中的错误/错误吗?谢谢。

.model small
.stack 50h

.data
Divisor db ?
Dividend db ?
Quotient db ?
Remainder db ?

.code
main_method   proc
              mov    ax, @data
              mov    ds, ax

              mov    ah, 01
              int    21h
              sub    al, 48
              mov    Divisor, al

              mov    ah, 01
              int    21h
              sub    al, 48
              mov    Dividend, al
              mov    bl, 00
              mov    al, 00
              mov    bl, Divisor
              mov    al, Dividend
              div    bl

              mov    Quotient, al
              mov    Remainder, ah

              mov    dl, Quotient
              add    dl, 48
              mov    ah, 02
              int    21h

              mov    dl, Remainder
              add    dl, 48
              mov    ah, 02
              int    21h
              mov    ah, 4ch
              int    21h
main_method   endp
              end    main_method

【问题讨论】:

  • “它无法正常工作” 可能意味着任何事情。更具体。
  • 即使我使用个位数,商和余数也会打印为一些随机符号。
  • 如果您评论您的代码会有所帮助!特别是因为这是很多年没有使用过的代码!!!此外,它还可以帮助您发现错误。
  • sub al, '0' 将使源代码中从 ASCII 到整数的转换在语义上清晰,而不是使用 48

标签: assembly masm masm32


【解决方案1】:

DIV BLAX 中的 16 位值除以BL,因此您应该清除那些您不使用的AX 位(在本例中是整个高字节)。所以在 DIV 之前,添加:

MOV AH,0

XOR AH,AH  ; XORing something with itself clears all bits


或者,如果您的目标是 80386 或更高版本,您可以将 Mov Al, Dividend 替换为 MOVZX AX, BYTE PTR Dividend

【讨论】:

  • 哦!非常感谢你,迈克尔!重置(清除)Ah 解决了这个问题。在认为它会替换现有值之前,我没有清除它,尽管我错了。谢谢。
【解决方案2】:

基本上DIV 函数将AX 相除,然后将商放入AL,余数放入AHAXAHAL 组成。所以如果你只想划分 AL 那么你必须确保 AH0 。你可以做下面的方法来做零。

MOV AH, 0

AND AH, 0

XOR AH, AH

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-31
    相关资源
    最近更新 更多