amir-roli
یک شنبه 05 خرداد 1392, 22:32 عصر
سلام
دوستان من با اسمبلی خیلی آشنا نیستم.
توی نت هم گشتم اما برنامه ها خیلی پیچیده بود و من نتونستم استفاده کنم.
یه کاراکتر رو میتونم چاپ کنم اما عدد رو نه.
لطفا کدشو برام بذارید مثه این
mov dl,'d'
mov ah,02h
int 21h
GENERAL IRAJ
دوشنبه 06 خرداد 1392, 00:57 صبح
سلام ، اونی که نوشتی فقط یه عدد یه رقمی رو میخونه
برای خواندن عدد ابتدا باید آن را به صورت رشته وارد کنی ، به عدد دو دویی تبدیل کند و در ثباتی ذخیره کند.
روش کار بدین صورت است که ابتدا فاصله های خالی ابتدای عدد رشته ای حذف می شودو سپس علامت عدد تشخیص داده می شود و پس از تشخیص علامت عدد باید مشخص شود که کاراکتر بعدی بین "0" تا "9" است یا نه
اگر نباشد عملیات پایان می یابد،ولی اگر باشد، به رقم 0 تا 9 تبدیل می شود . برای تبدیل کاراگتر به رقم ، کد اسکی کاراکتر با مقدار 000fh عمل AND صورت می گیردو مقادیر حاصل در ثبات AX قرار می گیرندوهمچنین مقدار اولیه AX باید صفر باشد ، ابتدا مقدار AX در 10 ضرب می شودو سپس رقم جدید به محتویات جدید AX اضافه می شود ، پس از تبدیل رشته عددی به عدد و قرار گرفتن در ثبات AX ، مقدار موجوددرثبات AX به رشته تبدیل شده در صفحه نمایش ظاهر می گردد تا از نتیجه کار آگاهی پیدا کنید.
این هم کد برنامه مورد نظر
datasg segment para 'code'
msg1 db 'Enter a number:',"$"
msg2 db 'The result string number is:',"$"
count db 0
sign dw ?
string db 6 dup(' '),"$"
sign1 db ?
strlist label byte ;start of parameter list
max db 20
len db ?
buffer db 20 dup(' ')
dolar db '$'
datasg ends
codesg segment para 'code'
main proc far
assume ds:datasg, cs:codesg
mov ax, datasg
mov ds, ax
mov ah, 6h ;clear screen
mov al, 25 ;number of rows
mov ch, 0
mov cl, 0
mov dh, 24 ;row
mov dl, 79 ;column
mov bh, 7 ;attribute
int 10h
mov ah, 2h ;cursor move
mov dh, 10 ;row
mov dl, 30 ;column
mov bh, 0 ;page number
int 10h
lea dx, msg1 ; print message
mov ah, 9h
int 21h
mov ah, 0ah ; read string
lea dx, strlist
int 21h
lea bx, buffer
while_blank: cmp byte ptr [bx], ' ' ; skip leading blank
jne end_while_blank ; exit while
inc bx
jmp while_blank
end_while_blank:
mov sign, 1 ;default sign multiplier
cmp byte ptr [bx], '+' ;leadin + ?
je skip_sign ;if so skip over
cmp byte ptr [bx], '-' ;leading - ?
jne save_sign ;if not save default +
mov sign, -1 ;-1 for minus sign
skip_sign: inc bx ;past sign
save_sign: mov ax, 0 ;number being accumulated
mov count, 0 ;count of digits so far
while_digit: cmp byte ptr [bx], '0' ;compare next car to '0'
jl end_while_digit ;if not a digit exit
cmp byte ptr [bx], '9' ;compare to '9'
jg end_while_digit ;not a digit if bigger than '9'
mov cx, 10 ;multiplier
mul cx ;multiply old number by 10
; jo overflow ;exit if product is too large
mov cl, [bx] ;mov ascii char to bl
and cx, 000fh ;convert to single digit integer
add ax, cx ;add to sum
; jc overflow ;exit if sum too large
inc count ;increment digit count
inc bx ;increment character pointer
jmp while_digit ;go next char
end_while_digit:
; cmp count, 0 ;no digit ?
; jz overflow ;if so, set overflow error flag
imul sign
;;;;;;;;;;;;;convert number in ax to string;;;;;;;;;;;;
lea bx, string
add bx, 5
mov sign, ' '
cmp ax, 0
jge setup ; skip if not negative
mov sign1, '-'
neg ax ; now ax > 0
setup: mov cx, 10 ; divisor
divloop: mov dx, 0 ; extend number to double word
div cx ; divide by 10
add dl, 30h ; convert
mov [bx], dl
dec bx
cmp ax, 0
jne divloop
mov cl, sign1 ; insert sign to string
mov [bx], cl
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
mov ah, 2h ;cursor move
mov dh, 12 ;row
mov dl, 30 ;column
mov bh, 0 ;page number
int 10h
; print result
lea dx, msg2 ;print the message
mov ah, 9h
int 21h
lea dx, string ;print the string number
mov ah, 9h
int 21h
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
mov ax, 4c00h
int 21h
main endp
codesg ends
end main
topcoder
دوشنبه 13 خرداد 1392, 20:27 عصر
mov ah ,02
mov dl ,'9'
int 21h
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.