# برنامه نویسی سطح پایین > برنامه نویسی اسمبلی خانواده x86 >  پیدا کردن max

## ghazal_mohammady

با عرض سلام و خسته نباشید خدمت اساتید گرامی، من در برنامه نویسی اسمبلی بسیار مبتدی هستم و نیاز به کمک فوری دارم،
سه برنامه رو هر  چه سریع تر باید تحویل بدم 
1) پیدا کردن ماکسیمم بین ده عدد ورودی 
2) انجام عمل ضرب بدون استفاده از عملگر ضرب
3) پیدا کردن کارکتر متفاوت در بین دو رشته ی و برگردادن مکان تفاوت

آیا می تونم از حضورتون کمک بگیرم ؟
پیشاپیش سپاس گزارم

----------


## xman_1365_x

شروع به نوشتن کنید هر جا مشکل داشتین سوال کنید،کدی هم که نوشتین قرار بدین

----------


## ghazal_mohammady

سپاس گزارم از توجه شما 
اما من اول اول راهم اصلا بلد نیستم باید چه کار کنم، وقتمم کمه 
میشه یه منبعی مرتبط به بنده معرفی کنید؟
باز هم سپاس گزارم

----------


## ghazal_mohammady

:افسرده: 
 
dseg segment 'data'
max db 0
maxstr db "maxstr: ",'$'
dseg ends
cseg segment 'code' 
    assume cs:cseg,ds:dseg
    MAIN PROC FAR       
    mov ax,dseg
    mov dx,ax   
 
    mov bx,10
    for:
    dec bx             
    MOV AH,1H   
    INT 21H  
    cmp bx,0
    je l2
    loop for
    l2: 
    SUB AL,48    
   cmp al,max
    ja l3
    l3:
     mov max,al  
    cmp bx,0
    je end1  
    end1:
    MOV AH,9H   
    lea dx,maxstr  
    INT 21H       
    MOV AH,2H   
    MOV DL,max 
    ADD DL,48   
    INT 21H         
  MOV AX,4C00H  
  INT 21H   
  MAIN ENDP
END MAIN

مثل این که مشکلشو نمی دونم چطور حل کنم

----------


## ghazal_mohammady

از مدیران محترم خواهش می کنم راهنماییم کنند، من دنبال راحت طلبی نیستم ولی متاسفانه در دانشگاه مدرس خوبی نداشتم و هیچ چیز یاد نگرفتم، اگه منابع مختصر و کاربردی می شناسید لطفا راهنماییم کنید 
بازهم سپاس گزارم

----------


## xman_1365_x

اگر در گوگل جستجو میکردین منابع زیادی میدیدین،برای برنامه ماکزیمم اول با استفاده از وقفه 21 تابع 10 یک بافر از ورودی بگیرید،بعد نیاز به حلقه دارین ده بار تکرار شه ساده ترین راه استفاده از دستور لوپ هست،بعد هم پیمایش هست اگر میتونید مثلا ادرس حافظه رو با اندیس کاهش یا افزایش بدین برای پیمایش کردن،دستور مقایسه هم cmp
از محیط emu8086 استفاده کنید، در منوی راهنماش مثال هایی از طرز استفاده زده
فکر کنم راهنمایی برای شروع کافیه
موفق باشید

----------


## f_talebi

متاسفانه اسمبلی کمی از یادم رفته. الان مشکل این کد چیه؟ میتونم برات ی سری توضیح ک یادم مونده رو بگم  نمیدونم ب دردت میخوره یا نه اما چون گفتی ک متوجش نمیشی فکر کردم شاید ب دردت بخوره کمی توضیح .


    mov bx,10  اینجا مقدار 10 رو به bx دادیم و bx برامون نقش شمارنده رو داره تو این برنامه.
    for:
    dec bx           داره یکی یکی از bx کم میشه .این همون bx-- تو سی پلاس پ  
    MOV AH,1H اینجا تابع1هگز رو به ah میفرستیم و تو خط بعد میگیم که این تابع از وقفه ی 21 هگز هستش.  
    INT 21Hهمیشه شماره ی تابع رو بهah میدیم و بعدش اون وقفه رو فراخوانی میکنیم. و هر تابع هم یه کار خاصی برامون انجام میده.  
    cmp bx,0 سی ام پی مخفف کلمه ی compare به معنی مقایسه کردنه. تو حلقه ها از این استفاده میشه که ببینیم کی حلقه مون تموم میشه. اینجا ک صفرو با bx مقایسه کرده ک بدونه مقدار bx چنده
    je l2 اگر برابر با صفر شد به l2 برو. Je نخفف jump equal هست اگه درست گفته باشم ک یعنی اگه در خط قبل عملگرها باهم برابر بودند  به این لیبلی ک جلوت نوشتم)l2( بپر
    loop for
    l2:  اینم لیبل l2:
    SUB AL,48     اومده مقداره 48رو از al کم کرده ظاهرا
   cmp al,max و اینجا al رو با max مقایسه کرده
    ja l3 اگر بزرگتر بود به لیبل l3 برو
    l3:
     mov max,al  
    cmp bx,0
    je end1  
    end1:
    MOV AH,9H   این چند دستور بالا هم ک مشخص بودن. و حالا این تابع 9h که به ah میره ؛کارش چاپ رشته هست و از این خط تا دو خط بعد همش مال چاپ رشتست.
    lea dx,maxstr   باید آدرس آفست متغیری که میخوای مقدارش چاپ بشه رو به dx بدی؛ دستور lea این کارو برات انجام میده. اون maxstr هم خودت تعریفش کردی قبلا و میخوای الان چاپش کنی.
    INT 21H       اینم وقفه ای ک باعث چاپ رشته میشه.پس تا اینجا شد چاپ رشته. 
    MOV AH,2H   متاسفاته کار تابع 2h رو بخاطر ندارم!
    MOV DL,max 
    ADD DL,48   
    INT 21H         
  MOV AX,4C00H  این تابع 4ch هم تا جایی ک یادمه آخر برنامه مینوسن و برای اتمام برنامه و آزاد کردن منابع هست
  INT 21H   و اینم وقفشه. همیشه وقفه آخر نوشته میشه .

----------


## f_talebi

اگه سرچ کنید خیلی چیزا پیدا میکنید.اینم مربوط ب وقفه ها : 

http://hpkclasses.ir/Courses/Assembly/asm1200.html

اینجا هم هست:

http://alirezakhelafati.blogfa.com/post/399

http://www.iran-eng.com/archive/inde...t-272649.html?

که منم با خوندن این مطالب ،این تابع ها رو که بلد نبودم یاد گرفتم! :

ﻭﻗﻔﻪ 21h

ﺗﺎﺑﻊ 01h. ﻳﮏ ﮐﻠﻴﺪ ﺭﺍ ﺍﺯ ﺻﻔﺤﻪ ﮐﻠﻴﺪ ﻣﯽ ﺧﻮﺍﻧﺪ.
ﮐﺪ ﮐﻠﻴﺪ ﺧﻮﺍﻧﺪﻩ ﺷﺪﻩ ﺩﺭ ﺛﺒﺎﺕ AL ﺑﺮﮔﺮﺩﺍﻧﺪﻩ ﻣﯽ ﺷﻮﺩ.

mov AH, 0lh
int 21h
mov AL, character
ﺗﺎﺑﻊ 02h. ﻳﮏ ﮐﺎﺭﺍﮐﺘﺮ ﺭﺍ ﺭﻭﯼ ﺻﻔﺤﻪ ﻧﻤﺎﻳﺶ ﻧﺸﺎﻥ ﻣﯽ ﺩﻫﺪ.
ﮐﺪ ﮐﺎﺭﺍﮐﺘﺮ ﺩﺭ ﺛﺒﺎﺕ DL ﺑﺎﻳﺪ ﻗﺮﺍﺭ ﺩﺍﺩﻩ ﺷﻮﺩ.

mov AH, 02h
mov DL,character
int 21h

----------


## ghazal_mohammady

با سلام و سپاس بسیار زیاد از راهنمایی های شما 
راستشو رو بخواین من تو جزوه م همه ی وقفه ها رو دارم اما برنامه نوشتن چیزیه که با تجربه باید مسلط شم مثلا این برنامه ی مکس رو ببینید، چرا خروجیش صفره ؟

dseg segment 'data'
max db 1,5,8,6,7,3,5,1,5,4
maxstr db "maxstr: ",'$'
dseg ends
cseg segment 'code' 
    assume cs:cseg,ds:dseg
    main proc far      
    mov ax,dseg
    mov dx,ax   
    mov bx,0
    mov al,max[bx]  
    sub al,48
    mov cx,10
    for: 
    inc bx 
    cmp al,max[bx]
    jna l1
    mov al,max[bx]
    l1:
    loop for          
         
    mov ah,2h   
    mov dl,al
    add dl,48  
    int 21h         
    mov ax,4c00h
    int 21h
    main endp
    cseg ends
end main

----------


## ghazal_mohammady

با سلام مجدد، خواهش می کنم استاید محترم کمکم کنند، مشکل این کدها چیه ؟

dseg segment 'data'
max db 1,5,8,6,7,3,5,1,5,4
maxstr db "maxstr: ",'$'
dseg ends
cseg segment 'code' 
    assume cs:cseg,ds:dseg
    main proc far      
    mov ax,dseg
    mov dx,ax   
    mov bx,0
    mov al,max[bx]  
    sub al,48
    mov cx,10
    for: 
    inc bx 
    cmp al,max[bx]
    jna l1
    mov al,max[bx]
    l1:
    loop for          
         
    mov ah,2h   
    mov dl,al
    add dl,48  
    int 21h         
    mov ax,4c00h
    int 21h
    main endp
    cseg ends
end main

----------


## ghazal_mohammady

و این کد

dseg segment 'data'
st_1 label byte
max1 db 40
len1 db ?
str1 db 40 dup(?) 
st_2 label byte
max2 db 40
len2 db ?
str2 db 40 dup(?)
msg1 db "PLZ enter string1:",'$'
msg2 db 10,13,"PLZ enter string2:",'$'   
dif db 0
dseg ends
cseg segment 'code' 
    assume cs:cseg,ds:dseg
    main proc far      
    mov ax,dseg
    mov dx,ax 
    mov ah,9h
    lea dx,msg1
    int 21h
    lea dx,st_1
    mov ah,0ah
    int 21h
    
    mov ah,9h
    lea dx,msg2
    int 21h
    lea dx,st_2
    mov ah,0ah
    int 21h
    mov bl,len1 
    mov bh,0
    
    mov cx,bx  
    for:
    mov al,str1[bx]
    mov bl,str2[bx]
    cmp al,bl
    jne  l2
    inc dif  
    l2:
    loop for
     
    mov dl,dif 
    add dl,48
    mov ah,2h
    int 21h
    mov ax,4c00h
    int 21h
    main endp
    cseg ends
end main

خواهش می کنم بزرگواری کنید و کمکم کنید، مشکل من فقط مبتی بودنه که نمیتونم برنامه به زبان اسمبلی بنویسم ؟؟؟

----------


## gh_mohammady

اساتید عزیز خواهش می کنم کمکم کنید، باقی کدهارو خودم درست کردم اما این کد رو نمیدونم باید چیکارش کنم 
باید مکس رو نشون بده ولی همش عدد آخر رو نشون می ده

 
dseg segment 'data'
max db 0
maxstr db "maxstr: ",'$'
dseg ends
cseg segment 'code' 
    assume cs:cseg,ds:dseg
    MAIN PROC FAR       
    mov ax,dseg
    mov ds,ax   
 
    mov bx,10
    for:
    dec bx             
    MOV AH,1H   
    INT 21H  
    cmp bx,0
    je l2
    loop for
    l2: 
    SUB AL,48    
   cmp al,max
    ja l3
    l3:
     mov max,al  
    cmp bx,0
    je end1  
    end1:
    MOV AH,9H   
    lea dx,maxstr  
    INT 21H       
    MOV AH,2H   
    MOV DL,max 
    ADD DL,48   
    INT 21H         
  MOV AX,4C00H  
  INT 21H   
  MAIN ENDP
END MAIN

----------


## Hr.Ziggurat

یه چندتا مشکل داره :
توی اون حلقه ی اول از loop استفاده کردی ولی به CX که مقدار ندادی! بعد شرط پایان حلقه رو اصلا BX گذاشتی!
بعد هر بار که عدد گرفته میشه ، عدد قبلی کجا میره؟!
اون خط l3 هم خیلی با حاله! چه AL از max بزرگتر باشه چه نباشه برنامه به l3 میرسه که!
BX قبل خط end1 چرا باید دوباره با 0 مقایسه بشه ؟ بدیهی که صفره!
باز واسه end1 که همون مشکل l3 وجود داره!

dseg segment 'data'
max db 0
maxstr db "maxstr: ",'$'
errstr db "digit error! ",'$'
dseg ends
cseg segment 'code' 
    assume cs:cseg,ds:dseg
    MAIN PROC FAR       
    mov ax,dseg
    mov ds,ax   
    mov ah,1
    mov cx,10
    for: 
    INT 21H  
    cmp max,al
    ja not_max
    mov max,al
not_max:
    loop for
    cmp max,48
    jb  error
    cmp max,57
    ja  error
    MOV AH,9H   
    lea dx,maxstr  
    INT 21H       
    MOV AH,2H   
    MOV DL,max   
    INT 21H   
    jmp endprog  
error:
    MOV AH,9H   
    lea dx,errstr  
    INT 21H   
endprog:    
  MOV AX,4C00H  
  INT 21H   
  MAIN ENDP
END MAIN

اینجور کدا فکر کنم راحت با google پیدا بشه...

----------


## gh_mohammady

از همکاری شما واقعا سپاس گز ارم  جناب Hr.Ziggurat

----------

