【问题标题】:Even and odd numbers in assembly language汇编语言中的偶数和奇数
【发布时间】:2017-01-18 13:00:30
【问题描述】:

我有这个汇编语言代码,它只显示一个数字是奇数还是偶数。我还想如果一个数字是偶数来显示数字的反面,如果是奇数来显示数字/2。你能帮我解决这个问题吗?谢谢。对不起我的英语不好

.model small
.stack 100h
.data
msg db 10,13,'Enter number=$'
msg1 db 10,13,'Number is even$'
msg2 db 10,13,'Number is odd$'
msg3 db 10,13, 'Case Convertion=$'






.code

   mov ax,@data
   mov ds,ax
   lea dx,msg
   mov ah,9
   int 21h

   mov ah,1
   int 21h


   mov bl,al

   cmp bl,'9'
   ja cc 


   sar bl,1  
   jc odd


   lea dx,msg1
   mov ah,9
   int 21h


   jmp exit

   odd:

   lea dx,msg2
   mov ah,9
   int 21h


   jmp exit



   cc:  

   lea dx,msg3
     mov ah,9
     int 21h  

   cmp bl,'A'
   jnle next



   next:

    cmp bl,'Z'
    jnge con

    jmp lower




   con:

     add bl,32d
     mov dl,bl
     mov ah,2
     int 21h

     jmp exit 


   lower:

      cmp bl,'a'
      jnle ln



    ln:
       cmp bl,'z'
       jnge conl



   conl:
      sub bl,32d
     mov dl,bl
     mov ah,2
     int 21h


     jmp exit 




   exit:
    .exit
    end

【问题讨论】:

  • 呃。带有过于简洁的标识符且绝对没有解释性 cmets 的格式错误的代码。我当然不想阅读这篇文章并弄清楚您要做什么!
  • 数字的反义词是什么?

标签: assembly x86 tasm


【解决方案1】:

如果是奇数则显示数字/2

mov bl,al 之后的字符 sar bl,1(shr 对我来说更有意义,除非你来自 Java,并且你认为对字节值进行签名是正常的)。

因此对于字符'7'(值37h),您将在bl 中生成1Bh,这在技术上是不可打印的字符。

如果您想在输出时打印输入'7'"3.5",您可以添加24 以计算ASCII 中的整个部分数字(1Bh + 24 = 33h = '3'),然后执行 将其输出为单个字符,然后输出'.''5' ASCII 字符(因为每个odd_number/2 将有".5" 小数部分)。

如果您想知道为什么幻数 +24 会产生半数...因为您输入的是 ASCII 字符 '7',而不是数字 7。 ASCII 中数字字形的值定义为48 + digit_value,在本例中为48+7 = 55 = 37h

所以要以“人的方式”计算 7/2,从 '7' 输入可以做到:

x = input - '0'   ; x = '7' - '0' = 7 (conversion to numeric value)
x /= 2            ; x = 7/2 = 3
output = x + '0'  ; converting it back to ASCII for displaying
                  ; output = 3+48 = 51 = 33h = '3'

现在写成单个公式,即:
输出 = (输入 - 48)/2 + 48
输出 = 输入/2 - 48/2 + 48
输出 = 输入/2 - 24 + 48
输出 = 输入/2 + 24

在标签odd:处,您已经在bl中拥有input/2值,而不是在odd:之后立即恢复原始(adc bl,bl),并一一进行-48 /2 +48操作,您可以直接+24直接得到结果。

这是理解你的输入的力量,你想要的输出,以及在这之间进行简单的数学推理,所有这些都在高层次上,甚至还没有触及任何 CPU 指令。

在你知道你想要计算什么之后,你编写 CPU 指令来完成它,在我的例子中是巨大的复杂 add bl,24,然后使用 int 21h 进行字符输出,我懒得添加,因为你已经在使用大写/小写转换了。


我有点担心这不是你所期望的答案,也许你会认为我有点在欺骗你......也许你会部分正确......再说一次,如果你能完全理解我的话做了,为什么,你应该很容易解决你的问题。


不幸的是我不知道什么是“相反”数字,我可以想象它下面的很多东西,但只有少数可以合理显示。

【讨论】:

    猜你喜欢
    • 2013-03-05
    • 2016-02-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-24
    • 2018-06-24
    相关资源
    最近更新 更多