2017-01-18 24 views
-3

У меня этот код на ассемблере, и он показывает только, если число нечетное или четное. Я также хочу, чтобы число даже отображало противоположное от числа, и если нечетно показать число/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 
+2

Ugh. Плохо отформатированный код с чрезмерно краткими идентификаторами и абсолютно никаких пояснительных комментариев. Я, конечно, не хочу читать это и выяснять, что вы пытаетесь сделать! –

+0

Что противоположно числу? – Ped7g

ответ

0

если нечетное, чтобы показать номер/2

После mov bl,al для символов < = «9» вы делаете sar bl,1 (shr бы больше смысла для меня , если вы не пришли с Java, и вы считаете, что это нормально, когда байтовые значения подписаны).

Так что для символа '7' (значение 37h) вы будете производить 1Bh в bl, который является технически непечатаемых символов.

Если вы хотите напечатать для ввода '7'"3.5" на выходе, вы можете добавить 24 вычислить всю часть цифр в ASCII (1Bh + 24 = 33h = «3»), а затем сделать вывод, что в качестве одного гольца, то выход '.' и '5' Символы ASCII (поскольку каждый номер odd_number/2 будет иметь десятичную часть).

Если вам интересно, почему магическое число +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, вместо того чтобы восстановить оригинал (adc bl,bl сразу после odd:), и делает -48 /2 +48 операцию один за другим, вы можете просто сделать +24, чтобы получить результат напрямую.

Это сила понимания, что у вас есть на входе, что вы хотите на выходе, и делаете простые математические рассуждения между всеми на высоком уровне, даже не касаясь какой-либо инструкции по процессору.

После того, как вы знаете, что вы хотите рассчитать, вы пишете инструкции процессора, чтобы сделать это, в моем случае огромный комплекс add bl,24, а затем char-output с int 21h, который я слишком ленив, чтобы добавить, поскольку вы уже делаете что один с преобразованием верхнего/нижнего регистра.


я как-то боюсь, что это не ответ вы ничего ожидать, может быть, вы будете думать, что я своего рода троллинг вас ... может быть, вы будете частично правильно ... Опять же, если вы будете полностью понять, что я сделал и почему, вы должны легко решить свой вопрос.


К сожалению, я понятия не имею, что такое «противоположное» число, я могу представить себе много вещей под ним, но лишь немногие бы разумно, чтобы отобразить.

 Смежные вопросы

  • Нет связанных вопросов^_^