汇编语言中的偶数和奇数

时间:2017-01-18 13:00:31

标签: assembly x86 tasm

我用汇编语言编写了这个代码,它只显示一个数字是奇数还是偶数。我也想要一个数字甚至是显示数字的反面,如果是奇数则显示数字/ 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

1 个答案:

答案 0 :(得分:0)

  

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

mov bl,al字符< ='9'之后你正在做sar bl,1shr会对我更有意义,除非你来自Java,你认为它将字节值签名是正常的。)

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

如果要在输出上打印输入'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'

现在写成单一的公式:
  output =(input-48)/ 2 + 48< =>
  output = input / 2 - 48/2 + 48< =>
  output = input / 2 - 24 + 48< =>
 输出=输入/ 2 + 24 < =>

与标签odd:一样,您已经在bl input/2值中,而不是在adc bl,bl之后恢复原始版本odd: -48 /2 +48操作逐个进行,您只需执行+24即可直接获得结果。

这是理解你对输入有什么,你想要输出什么,以及在高级别之间进行简单数学推理的能力,甚至还没有触及任何CPU指令。< / p>

在你知道你想要计算什么之后,你编写了CPU指令来执行它,在我的情况下是高速复杂的add bl,24然后使用int 21h的char输出,我太懒了添加,因为您已经在进行大小写转换。

我有点担心这不是你所期待的答案,也许你会认为我有点拖累你...也许你会部分正确......然后,如果你完全明白我是什么做了,为什么,你应该轻松​​解决你的问题。

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