Я застрял в проблеме, которую у меня есть для задания домашней работы, которое просит меня задать цифру от 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
Примечание: Вы не можете использовать функции библиотеки
Если мой вопрос остается неясным, пожалуйста, скажите мне, чтобы я мог попытаться задать свой вопрос четко, так что другие могут понять.
Спасибо!
Есть ли способ сделать то же самое, но без использования «XCHG» и «и» инструкции? Я ограничен только использованием материалов, которые уже изучены в классе, но благодаря этому удивительному ответу он подтолкнул меня к поиску путей решения моей проблемы. – AlternateRealm
Также, как бы я сделал это с функцией mov ah, 1h – AlternateRealm
@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