PDA

View Full Version : سوال: گرفتن ورودی از کاربر



majid976
شنبه 27 خرداد 1391, 12:54 عصر
با سلام
چطور میشه این سورس ضرب دو عدد 5 رقمی رو به ضرب دو عدد دو رقمی تغییر داد ؟
در حال حاضر 5 کاراکتر از کاربر میگیرد من میخوام یک تغییر بدم که تا دو کاراکتر بیشتر وارد نشود

PUTC MACRO char
PUSH AX
MOV AL, char
MOV AH, 0Eh
INT 10h
POP AX
ENDM
stacksg segment para stack 'stack'
dw 64 dup(?)

stacksg ends
datasg segment para 'data'

msg1 db "Enter Num 1>>>$"
msg2 db "Enter Num 2>>>$"
msg3 db "Result>>>>>>>>>>$"
num1 dw ?
num2 dw ?

datasg ends
codsg segment para 'code'

main proc far

assume ss:stacksg,ds:datasg,cs:codsg
mov ax,datasg
mov ds,ax

start:

PUTC 0dh
PUTC 0ah
lea dx,msg1
mov ah,09h
int 21h

call SCAN_NUM ;enter number 1
mov num1,cx

PUTC 0dh
PUTC 0ah
lea dx,msg2
mov ah,09h
int 21h

call SCAN_NUM ;enter number 2
mov num2,cx

PUTC 0dh
PUTC 0ah
lea dx,msg3
mov ah,09h
int 21h
mov ax,num1
mov bx,num2
mul bx ;zarb do adad(dx:ax=ax*bx)

mov bx,10000
div bx ;tagsim bar 10000(dx:ax/10000)
mov cx,dx ;backup
mov dx,0
mov bx,1000 ;tagsim bar 1000 (ax=ax/1000)
div bx
MOV AX,CX ;copy cx to ax baray 4 digit
mov dx,0
mov bx,1000 ;tagsim bar 1000(ax=ax/1000)
div bx
add al,48
mov ah,0eh ;print digit 1
int 10h
mov ax,dx ;copy dx to ax
mov dx,0
mov bx,100 ;tagsim bar 100 (ax=ax/100)
div bx
add al,48
mov ah,0eh ;print digit 2
int 10h

cbw
mov al,dl
mov dx,0
mov bl,10 ;tagsim bar 10 (ax=al/10)
div bl
mov cl,ah

add al,48
mov ah,0eh ;print digit 3
int 10h

cbw
mov al,cl

add al,48
mov ah,0eh ;print digit 4
int 10h

mov ah,00
int 16h
jmp start
mov ax,4c00h
int 21h
main endp
SCAN_NUM PROC NEAR
PUSH DX
PUSH AX
PUSH SI
MOV CX, 0
next_digit:
MOV AH, 00h
INT 16h
MOV AH, 0Eh
INT 10h
CMP AL, 0Dh
JNE not_cr
JMP stop_input
not_cr:
PUSH AX
MOV AX, CX
MUL CS:ten
MOV CX, AX
POP AX
CMP DX, 0
JNE too_big
SUB AL, 30h
MOV AH, 0
MOV DX, CX
ADD CX, AX
JC too_big2
JMP next_digit
too_big2:
MOV CX, DX
MOV DX, 0
too_big:
MOV AX, CX
DIV CS:ten
MOV CX, AX
PUTC 8
PUTC ' '
PUTC 8
JMP next_digit
stop_input:
POP SI
POP AX
POP DX
RET
SCAN_NUM ENDP
ten DW 10
codsg ends
end main

MostafaMohammadi
دوشنبه 29 خرداد 1391, 02:12 صبح
پروسیجر SCAN_NUM طوری نوشته شده که محدود به تعداد کاراکترهای ورودی نیست و حلقه اش با کلید Enter خاتمه پیدا می کنه. اگه می خوای محدود اش کنی به حداکثر یه عدد دو رقمی یا یه عددی که حتما دو رقمی باشه باید پروسیجر ات رو تغییر بدی. یکی از راه هاش اینه که به جای CX از یه ثبات دیگه تو محاسبات ات استفاده کنی و از دستور loop استفاده کنی. عملیات کاراکتر گرفتن ات رو بزاری تو loop و با مقدار اولیه CX رو 2 کنی. حالا اگه می خوای حتما دو رقم باشه دستور خروج از حلقه به شرط Enter رو حذف کن اگر هم می خوای حداکثر 2 کاراکتر باشه، شرط رو بزار سر جاش بمونه.