【问题标题】:Assembly language-How to make two inputted number as one?汇编语言-如何将两个输入的数字合二为一?
【发布时间】:2016-12-03 10:02:56
【问题描述】:

我正在尝试在这种情况下进行汇编语言编程:

    if age = 18 then write "You are of legal age" 
    else if age<18 then write "You are too young"
    else write "You should be working now"

这是我有问题的地方:

    mov ah,01h  "This is the first digit"
    int 21h
    mov bl,al
    mov ah,01h "This is the second'
    int 21h

当我输入一个两位数时,AL 有两个不同的值。我将第一个值移动到BL 以保存它,但我不知道下一步该做什么。请问如何让它们组合起来,就像我输入“17”时一样,它将是17h。我读过我需要减去 30h 但这仅适用于 0-9。我不知道从 10 号开始该怎么做。我正在使用 Tasm。

希望有人可以帮助我。

【问题讨论】:

  • 真正应该做的是使用缓冲输入 (INT 21h; AH = 0Ah) 一次读取两个字符。这将比一次读取一个字符并将它们连接起来更容易实现,也更典型。
  • "...我输入“17”,它将是 17h" 你确定 h 后缀是正确的吗?文本“17”在 十进制 中转换为 17,但在 十六进制 中转换为 11h!

标签: assembly x86 tasm


【解决方案1】:

要将两位输入存储为一个,试试这个

num db 0     ;declare a variable to store the two digit input
ten db 10     ;declare a variable that holds a value 10

mov ah,01h  ;This is the first digit
int 21h
SUB al,48D     ;subtract 48D 
MUL ten        ;multiply with 10 because this digit is in ten's place
mov num,al    ;mov first digit input in num

mov ah,01h  ;This is the second digit
int 21h
SUB al,48D 
ADD num,al   ;add second digit to num

现在你的两位数在变量num

请注意,我将第一个数字输入乘以 10,但我没有将第二个数字输入乘以任何值,因为它在一个位置。

【讨论】:

  • "我能问一下如何让它们组合起来,就像我输入 17 时一样,它会是 17h" 你没有回答这部分问题!请将此添加到您的答案中,并值得我投票。只需要几行代码...
  • @Fifoernik 编辑了我的答案。
  • 不是乘以 10,真正的装配专家会右移 2 和两次加法,例如lea xx, [xx+xx*4]; add xx, xx.
  • @CodyGray:在 16 位代码中这是一个巨大的 PITA,尤其是在您避免使用 32 位寻址模式的情况下。在可以假设为 286 的 16 位代码中,我倾向于写 sub al, '0' / imul bx, ax, 10 / get next digit / ...。这当然会在 BH 中留下高垃圾,但我们不在乎. (imul r8, r8, imm8 不可用。)但是,LEA 允许您同时从 ASCII 转换为整数:lea bx, [eax + eax*4 - '0'*5]。 \@amazing:无论哪种方式,在完成计算之前不要将其写入内存。这就是寄存器的用途。
  • 另外,我是唯一一个觉得将十进制常量写成48D 会让人分心/困惑的人吗?我的意思是,我的大脑希望它是一个十六进制常数,因为它是数字和十六进制数字(特别是 D)的混合。尤其是在这种情况下,当'0'(甚至30h)或者会是一种更清晰的写法。
猜你喜欢
  • 1970-01-01
  • 2013-02-20
  • 2017-04-07
  • 1970-01-01
  • 1970-01-01
  • 2011-10-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多