ورود

View Full Version : سوال: برنامه ای که تعداد حروف کوچک را میشمارد



ghasemloo
چهارشنبه 07 خرداد 1393, 17:59 عصر
سلام خسته نباشید من تایه جاهایی این کد رو می فهمم

; multi-segment executable file template.


data segment
; add your data here!
pkey db "press any key...$"

maxlen db 19
actlen db ?
numa db 19 dup(' ')

javab db 0dh,0ah,"javab=$"

numb db 2 dup(' '),0dh,0ah,"$"
ends


stack segment
dw 128 dup(0)
ends


code segment
start proc
; set segment registers:
mov ax, data
mov ds, ax
mov es, ax


; add your code here



lea dx,maxlen
mov ah,10
int 21h

mov cx,0
lea si,numa
l3: cmp [si],0dh
je l5
cmp [si],'z'
jg l7
cmp [si],'a'
jl l7
add cx,1
l7: add si,1
jmp l3
L5: mov ax,cx

lea si,numb
call bintoasc

mov ah,09h
lea dx,javab
int 21h

lea dx,numb
mov ah,09h
int 21h

lea dx, pkey
mov ah, 9
int 21h ; output string at ds:dx

; wait for any key....
mov ah, 1
int 21h

mov ax, 4c00h ; exit to operating system.
int 21h
start endp
bintoasc proc
add si,1
mov bx,10
l0: mov dx,0
div bx
add dl,'0'
mov [si],dl
or ax,ax
jz l1
dec si
jmp l0
l1: ret
bintoasc endp


ends


end start ; set entry point and stop the assembler.



یکی از قسمتهایی که متوجه نمی شم cmp [si],0dh
اگه میشه خط به خط قسمت کد رو برام توضیح بدین

vahid-p
جمعه 09 خرداد 1393, 00:37 صبح
خب با ah,10 , int 21h یک رشته حداکثر 19 بایتی از ورودی میگیره. سایز رشته هم در خونه بعد از maxlen قرار میگیره.
بعد si به اول رشته گرفته شده انتقال میده.
اون cmp [si],0dh میگه اگر به enter نرسیدی ( si یه ریجستر هست، [si] مقدار خونه si ام حافظه رو بر میگردونه ). گرچه فکر کنم با INT 21h/AH=10 اینتر ذخیره نمیشه. به هر حال میشد بهتر از این نوشت. چون طول رشته رو در si-1 داریم.
بعد میگه اگر اون کاراکتر از z بزرگتر یا از a کوچکتر بود، اونوقت برو لیبل l7 و اشاره گر si رو یکی ببر جلو و دوباره این کار رو تکرار کن تا بلاخره به اینتر برسی. باز میگم فکر نکنم اینتر ذخیره بشه.
به هر حال اگر از z بزرگتر نبود و از a کوچکتر نبود، پس حروف کوچک است و cx رو یکی افزایش میده ( تو لیبل l6 )
بعد عدد حاصل رو میذاره تو ax ( لیبل 5 ) و الان میخواد عدد رو چاپ کنه. برای انیکار اومده کد اسکی هر رقم رو داخل numb ذخیره میکنه و بعد نشون میده که کار جالبی به نظر نمیاد. میتونست مستقیم اونا رو بنویسه و اینقدر پیچیدش نمیکرد.
به هر حال call میکنه و با تقسیم متوالی و جمع با کاراکتر '0' اونا رو دخیره میکنه ( از رقم سمت راست ) و یکی یکی عقب میره تا بلاخره هیچ رقمی نمونه و نتیجه تقسیم صفر بشه.

بعد از اینکار عکس این عمل رو با INT 21h/AH=9 که رشته رو چاپ میکنه تا وقتی به $ برسه که متوقف میشه.


کل برنامه همین بود

ghasemloo
پنج شنبه 15 خرداد 1393, 12:17 عصر
ممنون دوست گلم