View Full Version : سوال: برنامه بنویسید که اعداد یک تا ده را چاپ کند
hamedv90
یک شنبه 25 اردیبهشت 1390, 21:02 عصر
سلام،
اگر کسی میتونه این دو سئوال رو جواب بده! الان حدود 6 ساعته دارم ور میرم اما نمیشه!!! استادمون هم اصلا بلد نیست درس بده! تا حالا یه خط کد برامون ننوشته! ممنون :ناراحت:
1. برنامه بنویسید که اعداد یک تا ده را چاپ کند
2. برنامه بنویسید که دو عدد را از ورودی گرفته و بزرگترین عدد را چاپ کند
unknown.unforgiven
یک شنبه 25 اردیبهشت 1390, 21:47 عصر
سلام
کدهایی که نوشتین رو بذارید تا کمکتون کنیم و بهتون بگیم مشکل از کجاشه
hamedv90
یک شنبه 25 اردیبهشت 1390, 21:51 عصر
سلام
کدهایی که نوشتین رو بذارید تا کمکتون کنیم و بهتون بگیم مشکل از کجاشه
stksg segment stack
stksg ends
datasg segment para 'data'
datasg ends
codesg segment para 'code'
main proc far
assume ds:datasg, cs:codesg
;----
mov cx,1
for:
cmp cx,10
jle repeat
jmp endfor
repeat:
mov dl,
mov ah,02h
int 21h
jmp for
endfor:
;----
mov ax, 4c00h
int 21h
main endp
codesg ends
end main
unknown.unforgiven
یک شنبه 25 اردیبهشت 1390, 22:01 عصر
خط 17 به dl چیزی رو mov نکردید (فکر کنم cx بوده که از قلم افتاده). وقفه 21h با ah برابر با 2 در خروجی کاراکتری که توی dl هست رو چاپ میکنه، اما شما داخل رجیستر dl یه کاراکتر با کد اسکی بین 1 تا 10 ریختید که با توجه به جدول اسکی شامل هیچ کدوم از اعداد نمیشه. واسه اینکه عدد چاپ کنید میتونید از ماکرو print_num موجود تو کتابخونه emu8086 استفاده بکنید
پ.ن: تو dl نمیشه cx رو mov کرد، چون dl هشت بیتی و cx شانزده بیتی هستش. تو این سوال میشه همون خط کد رو به این صورت نوشت:
mov dx,cx
hamedv90
یک شنبه 25 اردیبهشت 1390, 22:07 عصر
خط 17 به dl چیزی رو mov نکردید (فکر کنم cx بوده که از قلم افتاده). وقفه 21h با ah برابر با 2 در خروجی کاراکتری که توی dl هست رو چاپ میکنه، اما شما داخل رجیستر dl یه کاراکتر با کد اسکی بین 1 تا 10 ریختید که با توجه به جدول اسکی شامل هیچ کدوم از اعداد نمیشه. واسه اینکه عدد چاپ کنید میتونید از ماکرو print_num موجود تو کتابخونه emu8086 استفاده بکنید
خیلی ممنون از راهنمایی تون اما استاد ما micro رو درس ندادن. یعنی الان من باید چیکار کنم که بدون استفاده از ماکرو این کد کار کنه؟! :اشتباه:
unknown.unforgiven
یک شنبه 25 اردیبهشت 1390, 22:14 عصر
اگر اعداد بین 1 تا 9 بود میتونستی با اضافه کردن 48 تا به مقدار dl این اعداد رو چاپ بکنی، چون اعداد تک رقمی بودن. ولی چون میخوای 10 رو هم چاپ کنی (اعداد غیر تک رقمی) یه خورده کار سخت میشه، البته نه در حدی که نشه کاریش کرد. باید کاراکتر ها (ارقام) رو تک تک چاپ بکنی. ساده ترین راهی که الآن به ذهنم میرسه (به غیر از ماکرو) اینه که از BCD استفاده بکنی. روش تبدیل یه عدد به BCD رو اینجا (http://barnamenevis.org/showthread.php?283687-%D8%A8%D8%B1%D9%86%D8%A7%D9%85%D9%87-%D8%A7%D9%8A-%D9%83%D9%87-2-%D8%B9%D8%AF%D8%AF-%DA%86%D9%87%D8%A7%D8%B1-%D8%B1%D9%82%D9%85%D9%8A-%D8%A8%D9%87-%D8%B5%D9%88%D8%B1%D8%AA-BCD-%D8%AF%D8%B1-%D9%8A%D8%A7%D9%81%D8%AA-%D9%83%D8%B1%D8%AF%D9%87-%D9%88-%D8%A2%D9%86%D9%87%D8%A7-%D8%B1%D8%A7-%D8%A8%D8%A7%D9%87%D9%85-%D8%AC%D9%85%D8%B9-%D9%83%D9%86%D8%AF-%D8%9F) گذاشتم که میتونی ازش استفاده بکنی
hamedv90
یک شنبه 25 اردیبهشت 1390, 22:17 عصر
خیلی ممنون الان میرم میخوانم :قلب:
رفتم خوندم اما اون سخته من 0 تا 9 هم بتونم بنویسم عاله :لبخند: کد رو تغییر دادم اما کار نمیکنه :اشتباه:
stksg segment stack
stksg ends
datasg segment para 'data'
datasg ends
codesg segment para 'code'
main proc far
assume ds:datasg, cs:codesg
;----
mov cx,48
for:
cmp cx,58
jle repeat
jmp endfor
repeat:
mov dx,cx
mov ah,02h
int 21h
jmp for
endfor:
;----
mov ax, 4c00h
int 21h
main endp
codesg ends
end main
unknown.unforgiven
یک شنبه 25 اردیبهشت 1390, 22:34 عصر
1. کد اسکی 9 عدد 57 هست، خط 13 اصلاح باید بشه
2. شما تو این برنامه دارید cx رو چاپ میکنید ولی هیچ جایی مقدارش رو افزایش نمیدید. خط 20 به منظور افزایش cx نوشته شد
stksg segment stack
stksg ends
datasg segment para 'data'
datasg ends
codesg segment para 'code'
main proc far
assume ds:datasg, cs:codesg
;----
mov cx,48
for:
cmp cx,57
jbe repeat
jmp endfor
repeat:
mov dx,cx
mov ah,02h
int 21h
inc cx
jmp for
endfor:
;----
mov ax, 4c00h
int 21h
main endp
codesg ends
end main
پ.ن: چون کد اسکی یه عدد بدون علامت هستش استفاده از jle برای این نوع داده ای درست نیست. به جای این دستور از jbe استفاده کنید
hamedv90
یک شنبه 25 اردیبهشت 1390, 22:38 عصر
خیلی ممنون:قلب::لبخند:
hamedv90
دوشنبه 26 اردیبهشت 1390, 00:40 صبح
این هم برنامه 2 که کار نمیکنه لطفا ایراد هاشو بگید. ممنون
2. برنامه بنویسید که دو عدد را از ورودی گرفته و بزرگترین عدد را چاپ کند
stksg segment stack
stksg ends
datasg segment para 'data'
msg db 0dh,0ah,"Number: ","$"
result db 0dh,0ah,"Result: ","$"
num db ?
num2 db ?
datasg ends
codesg segment para 'code'
main proc far
assume ds:datasg,cs:codesg
;----
mov dx,offset msg
mov ah,9h
int 21h
;----
mov ah,01h
int 21h
mov si,ax
call asctobin
mov bx,ax
;----
mov dx,offset msg
mov ah,9h
int 21h
;----
mov ah,01h
int 21h
mov si,ax
call asctobin
;----
for:
cmp ax,bx
jb l1
jmp l2
l1:
mov dl,ax
mov ah,09h
int 21h
l2:
mov dl,bx
mov ah,09h
int 21h
;----
mov ax,4c00h
int 21h
main endp
codesg ends
;----Convert string to number(get si,out ax)
asctobin proc
push bx
push dx
mov ax,0
mov bx,10
up_asc:
cmp [si],'0'
jb exit_asc ;if < 0 then exit
cmp [si],'9'
ja exit_asc ;if > 9 then exit
mul bx;(dx:ax=bx*ax)=> dx==0
mov dl,[si]
sub dl,'0';48
add ax,dx
inc si
jmp up_asc
exit_asc:
pop dx
pop bx
ret
asctobin endp
end main
hamedv90
دوشنبه 26 اردیبهشت 1390, 13:22 عصر
کسی نیست جواب منو بده؟؟؟ :افسرده:
unknown.unforgiven
دوشنبه 26 اردیبهشت 1390, 17:26 عصر
کسی نیست جواب منو بده؟؟؟ :افسرده:
از صبح سر کلاس بودم.
هر وقت خواستی یه برنامه بنویسی اول رو کاغذ بنویس که میخوای چی کارا بکنی بعد شروع کن به کد نویسی. برای مثال تو این سوال میخوای max دو تا عدد رو بدست بیاری. اصلاً احتیاجی به زیر برنامه نیست، فقط میخوای دو تا عدد رو مقایسه بکنی. حتی احتیاج نیست کد اسکی رو به عدد تبدیل کنی چون تو کد اسکی هم اعداد به صورت خطی پیش میرن. تیکه ی مقایسه و چاپ از خط 37 به بعد هستش. اگر مشکلی بود بگو تا توضیح بدم
jmp start
msg db 'Number: $'
result db 'Result: $'
newLine db 0dh,0ah,'$'
num db ?
num2 db ?
start:
mov dx,offset msg
mov ah,9h
int 21h
mov ah,01h
int 21h
mov num,al
mov dx,offset newLine
mov ah,9h
int 21h
mov dx,offset msg
mov ah,9h
int 21h
mov ah,01h
int 21h
mov num2,al
mov dx,offset newLine
mov ah,9h
int 21h
mov dx,offset result
mov ah,9h
int 21h
mov al,num2
cmp al,num
jb l1
jae l2
l1:
mov dl,num
mov ah,02h
int 21h
jmp finish
l2:
mov dl,al
mov ah,02h
int 21h
finish:
mov ax,4c00h
int 21h
xman_1365_x
دوشنبه 26 اردیبهشت 1390, 17:32 عصر
دوست عزيز براي چاپ اعداد بيش از يك رقم بايد ارزش مكاني اونها رو بدست بياريد با تقسيم متوالي بر ده ميتونيد اونارو جدا كنيد اينجا چون فقط تا 10 هست يك بار تقسيم بيشتر نياز نيست،من براتون برنامه رو نوشتم سوالي بود بپرسيد .
stksg segment stack
dw 64
stksg ends
datasg segment para 'data'
x db 1,2,3,4,5,6,7,8,9,10 ;your number
char db ','
datasg ends
codesg segment para 'code'
main proc far
assume ds:datasg, cs:codesg, ss:stksg
mov ax,datasg
mov ds,ax
;this part show numbe 1..9 in display console
mov cx,9
mov ah,2
xor di,di
l1:
mov al,x[di]
add al,48 ;char 1 in ascii
mov dl,al
int 21h
push ax
mov dl,char
int 21h
pop ax
inc di
loop l1
;this part show number 10 in display console
xor ax,ax
mov al,x[di]
mov cl,10
div cl
add ax,3030h
mov cx,ax
mov ah,2
mov dl,cl
int 21h
mov dl,ch
int 21h
; wait for any key....
mov ah, 1
int 21h
mov ax, 4c00h ; exit to operating system.
int 21h
main endp
codesg ends
end main
موفق باشي
xman_1365_x
دوشنبه 26 اردیبهشت 1390, 17:44 عصر
درباره سوال دومتونم راهنمايي مي كنم خودتون شروع كنيد
1-دو رشته با استفاده از وقفه از ورودي بگيريد كه تعداد ارقامش مشخص باشه و در حافظه ذخيره كنيد.
2-دورشته دريافتي رو تبديل به عدد كنيد(همون پروسيجري كه داريد تبديل اسكي به باينري)
3- مقايسه دو عدد(نياز به شرط)
4-تشخيص نمايش اون متغير(نياز به شرط)
موفق باشي
hamedv90
دوشنبه 26 اردیبهشت 1390, 22:55 عصر
unknown.unforgiven: :قلب: خیلی ممنون، خیلی لطف کردی :لبخند: اگر کار طراحی و برنامه نویسی تحت وب داشتی بگو من با کمال میل برات انجام میدم :بامزه:
xman_1365_x: دست شما هم درد نکنه :قلب: ممنون بابت راهنماییتون
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.