PDA

View Full Version : مشکل در جمع 2 عدد



talent1
چهارشنبه 14 خرداد 1393, 12:05 عصر
من وقتی 2 عدد رو اینجوری جمع میکنم

mov ah,1
int 21h
mov bl,al


mov ah,1
int 21h
mov cl,al


add bl,cl
sub bl,30h

mov ah,2
mov dl,bl
int 21h



تا وقتی جواب 1 رقمیه درسته و لی وقتی 2 رقمی میشه جواب به صورت عدد در
نمیاد باید چی کار کرد :افسرده:

من تو emu8086 قمت exe مینویسم
لطفا سریع کمک کنید .

vahid-p
چهارشنبه 14 خرداد 1393, 14:55 عصر
تو چند تاپیک اخیر همش همین مشکل رو داشتند.
مشکل شما در جمع اعداد نیست، بلکه در نمایش اعداد است. گرچه این طریقه هم اشتباهه، چون اینجا فقط دو عدد جمع کردید درست بوده وگرنه شما باید sub cl,'0' کنید همانطور که bl رو به عدد تبدیل کردید و بعد از محاسبات هر رقمش ( با تقسیم های متوالی ) رو با '0' جمع کنید و در خروجی چاپ کنید. ( دقت کنید هر رقمش رو و اونو باید نمایش بدید )
برای کار شما خیلی ساده میشه اینکار رو انجام داد ( اگه میدونید حداکثر رقم هات 4 رقمی از تقسیم بر هزار، صد و ده میتونی رقمهاش رو جدا کنی )، ولی برای اینکه نخوام دوباره کاری کنم، یک ماکرو یک تاپیک قبل از این نوشتم که به دردتون میخوره. این تا 10 رقم رو به راحتی نشون میده و اگر هم خواستید با اندک تغییری میتونید اونو بیشترش کنید. البته اگر خواستید دوبار یا چند بار در طی یک بار اجرای برنامه استفاده کنید باید کل کاراکترهای RESSTR رو به $ تغییر بدید ( تا مقادیر قبلی پاک بشن و به گفته ای مقدار دهی اولیه کنی ). به هر حال، ابتدا در قسمت Data Segment یک متغیر به این صورت تعریف کنید :


RESSTR DB 12 DUP('$')

و بعد این ماکرو رو بالای برنامتون بنویسید.

;------------------------------

PRINTNUM MACRO NUM

LEA SI,RESSTR

ADD SI,10

MOV AX,NUM

LABEL1:

MOV BX,10

MOV DX,0

DIV BX
ADD DL,'0'
MOV [SI],DL
DEC SI
CMP AX,0
JNZ LABEL1
LEA SI,RESSTR
DEC SI
LABEL2:
INC SI
CMP [SI],'$'
JE LABEL2
LABEL3:
MOV DX,SI
MOV AH,09H
INT 21H
ENDM
;------------------------------




توجه : این ماکرو عدد NUM که میتونه ریجستر جواب حاصل جمعتون باشه رو میگیره و چاپ میکنه. توجه کنید اگر بخواید از ماکرو چندین بار استفاده کنید، طبق تعریفی که از ماکرو میدونید Label هاش باید Local تعریف بشن. پس توصیم اینه به صورت procedure بنویسید اینو.
اما نحوه جمع دو عدد تک رقمی که در بالا گفتید این میشه :


mov ah,1
int 21h
mov bl,al
sub bl,'0'

mov ah,1
int 21h
mov cl,al
sub cl,'0'

add bl,cl
mov bh,0
PRINTNUM BX

talent1
چهارشنبه 14 خرداد 1393, 16:18 عصر
خب ما تا حالا با ماکرو کار نکردیم
اگه از این استفاده کنم خب نمره ای نمیگیرم

vahid-p
چهارشنبه 14 خرداد 1393, 17:39 عصر
ماکرو اصلا چیز قابل داری نیست. یعنی من خودم ازش استفاده نمیکنم، این برای یه دوست دیگه نوشته بودم.
خب اونو به صورت procedure براتون مینویسم. گرچه نوشتنی نمیخواد، فقط کافیه قبل از Call مقدار جواب رو داخل AX قرار بدید و از طرفی خط mov Ax,num رو از ماکرو حذف کنی، میشه Procedure.
اینطوری :

PRINTNUM PROC

LEA SI,RESSTR

ADD SI,10

LABEL1:

MOV BX,10

MOV DX,0

DIV BX
ADD DL,'0'
MOV [SI],DL
DEC SI
CMP AX,0
JNZ LABEL1
LEA SI,RESSTR
DEC SI
LABEL2:
INC SI
CMP [SI],'$'
JE LABEL2
LABEL3:
MOV DX,SI
MOV AH,09H
INT 21H
PRINTNUM ENDP

شما جواب رو داخل AX بریزید و Call کنید. همین!

talent1
چهارشنبه 14 خرداد 1393, 20:32 عصر
الان یعنی 2 تا عدد رو بگیرم add کنم تو ax :اشتباه:
درسته