2014-11-01 2 views
1

Я застрял в проблеме, которую у меня есть для задания домашней работы, которое просит меня задать цифру от 0 до 5 цифр (например, они могут вводить 1, 12, 123 , 1234) Я знаю, как спросить пользователя о любом количестве, которое они хотят, используя цикл, а затем используя функцию mov ah, 1h, но я хочу взять вход пользователя, скажем 123, а затем сохранить это число в переменной который я создал, Y. Затем я хочу обработать его, я уже знаю, как обрабатывать число, но только тогда, когда я уже объявил номер в переменной (Y dw 123), но так как я должен задать пользователь для ввода, я должен оставить переменную неинициализированной (Y dw?). Теперь, когда я застрял, я решил просто создать это вместо «Y dw?», «Y dw 0,0,0,0,0», я сделал это, чтобы я мог вручную ввести номер в эту переменную Y.Язык ассемблера x8086 - Получение ввода пользователя

В принципе, мне интересно, как я могу взять каждое число входов пользователей и хранить его в моей переменной Y, где я могу использовать его только если он был «Y с.в. 123»

Вот то, что я до сих пор :

title lab6 (lab6.asm) 

.model small 
.stack 100h 
.data 

    Y dw 0,0,0,0,0 ,0dh, 0ah 
    W dw ? 
    Sum dw ? 
    printSum db "The Sum is: "  
    sumMessage db 0,0,0,0,0  ,0dh, 0ah 
    printW db "W is: " 
    wMessage db 0,0,0,0,0 ,0dh, 0ah, '$' 


.code 
main proc 
    mov ax,@data 
    mov ds,ax 

    mov bx, 0 
     mov si, 1 
     loop1: 
      mov ax, 0 
      mov ah, 1h 
      int 21h 
      cmp al, 0dh 
      je endloop 
      mov bl, al 
      mov Y+si, ax 
      inc si 
     loop loop1 
     endloop: 
     mov ax, 0  
     mov Y, bx 



    mov ax,Y  ;Store Y in ax register 
    sub ax,1 
    mov Y, ax 
    mov ax, 0 

    mov Sum,36   ; add 36 to Sum 
    mov bx,Y 
    add Sum,bx   ; add 36 and Y into Sum 
    mov ax,Y 

    mov bx,4   ; take Y and divide by 4 
    mov dx,0 
    idiv bx 
    add Sum,ax 

    mov ax,Y   ;take Y and divide by 100 
    mov bx,100 
    mov dx,0 
    idiv bx 
    add Sum,ax 

    mov bx,7 
    mov dx,0      ; calculate W 
    idiv bx 
    mov W,dx 
    add W,1 
    mov dx, W  

    add dl, 30h 
    mov wMessage+1, dl 

    mov ax, 0 
    mov dx, 0 
    mov ax,Sum 
    mov cx, 10   ;start modding the number 2553 
    idiv cx 

    mov si, 4 

    sumLoop:     ;Loop to mod and store 2553 into sumMessage 
     add dl, 30h 
     mov sumMessage+[si], dl 
     mov dx, 0 
     mov cx, 10 
     idiv cx 
     dec si 
     cmp si, 0h 
     je endSum 

    loop sumLoop     

    endSum: 


    mov si, 0 
    mov cl, printSum 

    L1:        ;Loop to print out "Sum is : 2553 
     mov al, 0 
     mov al, printSum[si] 
     inc si 
     cmp al, '$' 
     je end_loop 
     mov dl, al 
     mov ah, 2h 
     int 21h 

    loop L1: 

    end_loop: 


    mov ax,4C00h 
    int 21h 

main endp 
end main 

Для кода, который есть у меня сейчас, если я введу 123 в качестве входных данных пользователя дает мне, что сумма: 0098 и W 1, которая должна быть не так, то сумма должна на самом деле будет 0189, а W - 6. Также мне было интересно, как я возьму ведущие 0.

Вот инструкции для этого задания:

Написать программу, которая вычисляет следующее:

Y = (Получить пользовательский ввод)

Y = Y-1

Sum = 36 + Y + (Y/4) + (Y/100)

W =% Сумма 7 + 1

Мощность Вт, Sum

Примечание: Вы не можете использовать функции библиотеки

Если мой вопрос остается неясным, пожалуйста, скажите мне, чтобы я мог попытаться задать свой вопрос четко, так что другие могут понять.

Спасибо!

ответ

0

Попробуйте что-то вроде этого, чтобы ввести номер:

 mov  cx, 10 
     mov  bx, 0 
loop1: 
     mov  ax,0100h 
     int  21h 
     cmp  al,0dh 
     je  endloop 
     and  ax,0fh 
     xchg ax,bx 
     mul  cx 
     add  bx,ax 
     jmp  loop1 
endloop: 
     mov Y, bx 
+0

Есть ли способ сделать то же самое, но без использования «XCHG» и «и» инструкции? Я ограничен только использованием материалов, которые уже изучены в классе, но благодаря этому удивительному ответу он подтолкнул меня к поиску путей решения моей проблемы. – AlternateRealm

+0

Также, как бы я сделал это с функцией mov ah, 1h – AlternateRealm

+0

@AlternateRealm - я удалил один из xchg, поскольку он не был нужен. Нет смысла делать mov ah, 01h, mov al, 00h, против mov ax, 0100h. Без xchg вам нужен третий регистр, а на dx влияет умножение, поэтому вы можете использовать: mov si, ax ... mov ax, bx ... mul cx ... mov bx, ax ... add bx, si. Вместо и ax, 0fh, вы можете использовать sub al, 030h ... mov ah, 000h. – rcgldr

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