【问题标题】:better method for displaying result in Decimal - TASM以十进制显示结果的更好方法 - TASM
【发布时间】:2012-09-20 17:55:30
【问题描述】:

我想编写一个程序,将两个数字相加并以十进制形式显示结果,最初它看起来很简单,但结果却不是!!! 因为十进制只有 0-9 个字符,当我们想要添加任何大于我们必须执行一些数学运算的数字时,

这是我所做的, 我想加两个数字 35 和 39,

35 + 39 = 74

MOV BL,35H
MOV AL,39H
ADD AL,BL

DAA ;Decimal after Addition => the result of it would be 0074H


PUSH AX     ;PRESERVE 0074H

; Separating the two numbers

AND AL,00001111B ; AL => 0000 0100 
ADD AL,30H       ; ; AL => 0004H + 30H = 4 of Decimal

POP AX ;AX = 74H => 01110100

ROR AL,1
ROR AL,1
ROR AL,1
ROR AL,1

AND AL,00001111B ;AL => 0000 0111
ADD Al,30H       ;A: => 0007H + 30H = 7 of Decimal
MOV DL,AL 



MOV AH,4CH ;Return Control to the DOS
INT 21H

我恢复了两个数字,但现在如何将结果显示为“74”???

另外,这种方法太费时间了,有没有更好更有效的方法呢?

【问题讨论】:

  • 1) 您忘记在计算后将第一个数字存储在某处。
  • 即使我存储如何最终将两个数字合并为一个结果?
  • 这取决于您希望看到的形式:作为保存在内存中的字符串或作为寄存器中的两个字节值。但是您是如何开始为 8086 运行 dos 进行编程的呢?
  • 你能告诉我两种方式吗?我在我们学校教授的 Windos 7 64 位中使用 TASM 和 DosBox
  • 好吧,在“POP AX”指令之前插入“MOV DH,AL”。然后在指令'MOV DL,AL'之后,您将在DX的上半部分拥有最高有效数字(实际上是它的ASCII表示),在DX的下半部分拥有最低有效数字。另一种方法是将一些内存位置加载到寄存器 DI 中,然后每次在 AL 寄存器中获得下一个数字时使用 stosb 指令。请记住,stos 指令行为受 PSW 中方向位的影响。保重)

标签: assembly x86 tasm


【解决方案1】:
MOV BL,35H
MOV AL,39H
ADD AL,BL

DAA          # al = 74h = 0111.0100

XOR AH,AH    # ah = 0 (just in case it wasn't)
             # ax = 0000.0000.0111.0100

ROR AX,4     # ax = 0100.0000.0000.0111 = 4007h
SHR AH,4     # ax = 0000.0100.0000.0111 = 0407h
ADD AX,3030h # ax = 0011.0100.0011.0111 = 3437h = ASCII "74" (reversed due to little endian)

现在您只需将 AX 复制到缓冲区并打印它。

【讨论】:

    【解决方案2】:

    您可以将结果打印为单个字符('7' 表示 7,'4' 表示 4)或将这些字符组合成一个字符串,在其上附加 '$' 字符并打印该字符串(终端 '$ ' 不会被打印出来)。

    DOS 具有打印单个字符(ah=2、dl=ASCII 字符代码)和以 $ 结尾的字符串(ah=9、ds:dx=$ 结尾的地址的功能字符串)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-09-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多