# برنامه نویسی سطح پایین > برنامه نویسی اسمبلی خانواده x86 >  تغییرات در ماشین حساب به زبان اسمبلی

## jamjid

یه برنامه اسمبلی است که می خواهم کمکم کنید چون به کمک شما احتیاج دارم البته مشکل من برای شما سخت نیست 
در برنامه ای (یه ماشین حساب ساده)که می توانید آنرا از اینجا دانلود کنید به مشکل برخوردم


http://hosseindn.persiangig.com/calc.rar
می خواهم هنگام تعریف متغیر برای گرفتن ورودی از کاربر به جای دستورات زیر






DIGIT1   DB 3,?,3 DUP(?)
از دستور زیر استفاده کرد(همان دستورات گرفتن رشته از کاربر)






Strlist lable byte
max db 3
len  db ?
Buffer  db 3 dup(' ')
این دستورات آرایه ای تعریف می کند و با استفاده از شماره سرویس 
0h
Ah از شماره وقفه 21
‌ از کاربر ورودی را گرفت 

mov ah, 0ah
lea dx, strlist
int 21
من می خواهم بدانم اگر بخواهم از روشی که گفتم استفاده کنم باید در کدام قسمت برنامه تغییرات اعمال کرد تا برنامه به همان روال قبل جواب بدهد
در برنامه از متغیرهایی مانند Digit1+2 استفاده شده من اگه بخواهم به روشی که گفتم عمل کنم باید تغییراتی اعمال کنم چون متغیر Digit1 تغییر می یابد 

مشکل دوم این اینست که چطوری می تونم از کاربر تا 8 رقم ورودی بگیرم و برنامه جواب درست بدهد 
)برنامه تا 2 کاراکتر بیشتر ورودی نمیگیرد ( 
لازم به ذکر است که من به جای اعداد 3 در Data segment ‌عدد 9 گذاشتم . کاربر میتوانست تا 8 رقم عدد ورودی بدهد ولی برنامه جواب درست به کاربر نمی داد 

اگه لطف کنید این تغییرات را به من بگید ممنون میشم
البته این برنامه از همین سایت که توسط آقا مهدی ... گذاشته شده بود دانلود کردم
قبلا از بچه های همین سایت کمک گرفته بودم ولی به نتیجه نرسیدم
امید وارم با کمک همه دوستان به نتیجه برسیم

با تشکر از همه دوستان

----------


## Delphi Coder

این برنامه اصلا مشکل داره از بیخ شما چیشو میخواید درست کنید.
 
6+5=136!!!!!!!!!!!!!!!!
12*3=516!!!!!!!!!!!!!!!!
12/4=0!!!!!!!!!!!!!!!!!!!!

----------


## jamjid

دوست عزیز قالب ورودی این برنامه به شکل زیر است 
## @ ##
#= عدد و @=علامت 
شما باید به شکل زیر ورودی وارد می کردید
06 + 05
12 * 03
12 / 04
===> یک عدد دو رقمی وارد می کنید بعد کلید اینتر ، بعد علامت دوباره کلید اینتر و سپس یک عدد دو رقمی دیگر نیز وارد می کنید و برای جواب گفتن دوباره کلید اینتر را فشار دهید

----------


## Delphi Coder

> من می خواهم بدانم اگر بخواهم از روشی که گفتم استفاده کنم باید در کدام قسمت برنامه تغییرات اعمال کرد تا برنامه به همان روال قبل جواب بدهد


به جای اینکه DIGIT1 رو به وقفه بدید آدرس Strlist یا max رو جایگزین کنید.


> مشکل دوم این اینست که چطوری می تونم از کاربر تا 8 رقم ورودی بگیرم و برنامه جواب درست بدهد


 از دستورات و رجیسترهای 32 بیتی به جای 16 بیتی استفاده کنید.

----------


## jamjid

> از دستورات و رجیسترهای 32 بیتی به جای 16 بیتی استفاده کنید


چطوری این کار را بکنم؟

----------


## jdeveloper

شما با استفاده از رجیسترهای 32 بیتی مثل EAX به جای AX این کار رو میتونید انجام بدید البته این کار از 386 به بالا مجاز است.

----------


## jamjid

منظورتون این است که من در اول هر ثبات E بگذارم .؟
 در مورد کدام ثباتها میشه این کار را کرد ؟

----------


## jamjid

در کتب آقای جعفر نژاد در فصل 7 از یه یک کتابخانه lib.asm صحبت شده است که در ان توابع آماده است مثلا برای دریافت یک عدد .
اگه من برنامه را با اون توابع بنویسم چطور است ؟
من این فایلlib.asm را ندارم اگه میشه برایم بفرستید 
ممنون میشم اگه یه مثال از تابع get_num  آن برایم بزنید
مثلا برای گرفتم یه عدد 8 رقمی چطور باید از آن استفاده کرد 
ممنون
با تشکر

----------


## Delphi Coder

.MODEL TINY
.386p
.CODE
ORG 256
s:
mov eax,012345678
ret
END s
این یه برنامه com هست که توش از رجیستر 32 بیتی استفاده شده و با tasm هم میشه اسمبل کرد. پس از این بابت مشکلی نیست.
حالا شما چرا نمی تونید از رجیستر های 16 بیتی استفاده کنید؟ چون جا نمیشه و نمیتونه محاسباتی که میخواید انجام بدید رو پوشش بده.
ولی استفاده از دستورات و رجیسترهای 32 بیتی کمک میکنه تا این مشکل حل بشه.

----------


## jamjid

سلام 
از این که شبه دستور 0386 را به من یاد دادید ممنون چون من قبلا این دستور را نمی دانستم 
من از این دستور استفاده کردم و برنامه اسمبل شد وفایل اجرایی آنر ساخت 
ولی وقتی آن  را اجرا می کنم با این پیام خطا زیر می شوم . حال شما بگو مشکل چیست؟
"NTVDM.EXE has encountered a problem and needs to close.  We are sorry for the inconvenience."
تغییراتی را که هم اعمال کردم این بوده است که به جای ثبات های ax,bx,cx,dx ثبات های eax,ebx,ecx,edx استفاده کردم .
منتظر جواب هستم .
در ضمن عرض کنم که آدما هیچ وقت نمی توانند به یک چیز خاص تسلط کامل پیدا کنند .
ممنون میشدم توصیه هایتان را با پیام خصوصی می گفیتد.

----------


## Delphi Coder

فقط این کار کافی نیست. ببینید مثلا وقتی پارامتر دستور div از نوع بایت باشه ax تقسیم بر پارامتر میشه خارج قسمت در al و باقیمانده در ah قرار میگیره. وقتی نه پارامتر 16 بیتی میشه اینبار DX:AX تقسیم بر پارامتر میشه بعد ax میشه خارج قسمت و dx باقیمانده ..... منظورم اینه که به همه چیز باید حوستون باشه بعضی جاها تغییرات خوهید داشت و فقط با اضافه کردن e جلوی رجیسترها طبیعتا برنامه جواب نمیده. 



> من از این دستور استفاده کردم و برنامه اسمبل شد وفایل اجرایی آنر ساخت 
> ولی وقتی آن را اجرا می کنم با این پیام خطا زیر می شوم . حال شما بگو مشکل چیست؟
> "NTVDM.EXE has encountered a problem and needs to close. We are sorry for the inconvenience."


 با TD286 برنامتونو debug کنید ببینید مشکل کجاست. با دیباگر dos نمیشه چون اون دستورات 32 بیتی رو نمیتونه disassemble کنه.

----------


## jdeveloper

اگر شما بخواهید یک برنامه مثلا ماشین حساب را که یک عدد دورقمی میگیرد واز سیستم شانزده بیتی استفاده میکند به برنامه سی و دو بیتی تغییر دهید باید کل سیستم برنامه را عوض کنید

----------


## jamjid

این دفعه اول من است که می خواهم برنامه 32 بیتی بنویسم .دو تا کتاب اسمبلی معروف هم دارم ولی ادر این کتابها از برنامه های 16 بیتی استفاده کردند و به همین دلیل است که اشکالات زیادی دارم
اگه شما کمک کنید قصد دارم برنامه را از اول خودم بنویسم 
من فرصت کمی دارم و به کمک شما دوستان شدیدا احتیاج دارم 
1-گرفتم اعداد در 32 بیتی با 16 بیتی تفاوتی دارد؟
2- وقتی از EAX به جای AX ‌استفاده می کنیم Ah ,Al هم تغییر می کند؟
3- دستورات جمع و ضرب وتقسیم و تفریق در 32 بیتی فرقی دارد؟
4- اگر مسائل دیگری هم هست که ممکنه مفید باشه ممنون میشم ذکر کنید 
با تشکر
 در ضمن منTD286 را ندارم 
دوباره تغیراتی اعمال کردم فایل اجرایی را ساخت 
ولی وقتی اجرا می کنی ،‌ فقط یه صفحه سیاه ظاهر میشه (اجرا میشه) ولی نمیدونم چرا دستورات را انجام نمیده 
اگه لازم هست برنامه را آپلود کنم

----------


## jdeveloper

2 - AX شانزده بیت اول EAX را تشکیل میدهد یعنی اگر بخواهید به ورد اول EAX دسترسی داشته باشید باید از AX استفاده کنید

           |      8bit   آال            |      bit 8    آ هاش       |                       16bit                |

----------


## jdeveloper

3- بله حتما" تا اونجایی که من  مطلع هستم دستورات برروی بایت یا ورد عمل میکنند مثلا برای جمع دو عدد 32 بیتی میتونید اون رو به دو عدد 16 بیتی تقسیم کنید

اگر یک عدد شما در AX:DX ویکی  در  Y+2 و  Y باشد     ADD AX , Y              ADC DX,Y+2

----------


## jdeveloper

البته الان که من نگاه کردم میشه مستقیما" از رجیستر 32 بیت در دستورات هم استفاده کرد مثلا Mov  Eax , 76  مشکلی ایجاد نمیکنه . پس میتونید مستقیما MOV EAx, Y رو اجرا کنید البته Y باید از نوع Double باشه یعنیY DD

----------


## garib22001

ba salam .mishe tagsim 16 biti bar 8 biti ro bedon estefade az dastor div va fagat ba shift kardan ro dar micro z80 baram bezarin ba tashakor.

----------


## sarbandi

.model small
.data
oprand1    db   9   dup(0)
oprand2    db   9   dup(0)
natigeh    db   20  dup('0')
    len1     db   0
    len2     db   0
    len3     db   0
col      db   0
row      db   0
    mot      db   0
    mot1     db   0
    mot2     dw   0
    mot3     dw   0
ka_ge     dw   0
count     dw   0
    si1      dw   0
    di1      dw   0
sign     db   0
operate  db   0
ja0      db  'ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ  ÄÄÄÄÄ¿','$'
ja1      db  '³                             ³','$'
ja2      db  'ÃÄÄÄÄÄÂÄÄÄÄÄÂÄÄÄÄÄÂÄÄÄÄÄ  ÄÄÄÄÄ´','$'
ja3      db  '³  1  ³  2  ³  3  ³  4  ³  5  ³','$'
ja4      db  'ÃÍÍÍÍÍÅÍÍÍÍÍÅÍÍÍÍÍÅÍÍÍÍÍ  ÍÍÍÍÍ´','$'
ja5      db  '³  7  ³  8  ³  9  ³  0  ³ esc ³','$'
ja6      db  'ÃÍÍÍÍÍÅÍÍÍÍÍÅÍÍÍÍÍÅÍÍÍÍÍ  ÍÍÍÍÍ´','$'
ja7      db  '³  +  ³  -  ³  *  ³  /  ³  =  ³','$'
ja8      db  'ÀÍÍÍÍÍÁÍÍÍÍÍÁÍÍÍÍÍÁÍÍÍÍÍ  ÍÍÍÍÍÙ',0ah,0dh,'$'
.code
calculator proc
;//////////////////////////////////////////
    mov   ax,@data
    mov   ds,ax
call   cls
call   shekl
calculatorp:
 call  amaliat
 mov   ah,00h
 int   16h
 cmp   al,27
 je    calc_ret
 call  start
jmp  calculatorp
calc_ret:
mov   ah,4ch
int   21h
calculator   endp
;/////////////////////////////////
cls  proc
    push  ax
    push  bx
    push  cx
    push  dx
    mov   bl,0h
    mov   cx,0000h
    mov   dx,184fh
    mov   bh,07h
    mov   al,00h                 ;cls function
    mov   ah,06h
    int   10h
    mov   dx,0000h
    call  gotoxy
    pop   dx
    pop   cx
    pop   bx
    pop   ax
 ret
cls  endp
;////////////////////////////
operatore  proc
   cmp  al,'*'
   jne  opr1
   jmp  opr_ret
opr1:
   cmp  al,'+'
   jne  opr2
   jmp  opr_ret
opr2:
   cmp  al,'-'
   jne  opr3
   jmp  opr_ret
opr3: cmp  al,'/'
   jne   opr_num
opr_ret:  mov  operate,al
    call  cout_char
    mov   mot,1
    mov   mot1,1
opr_num:
    ret
 operatore   endp
;////////////////////////////
 detect  proc
   cmp   al,'9'
   jg   det_ret
   cmp   al,'0'
   jl   det_ret
   call cout_char
   sub   al,'0'
   mov  [si],al
   dec  si
   inc  len1
det_ret:
     ret
detect   endp
;////////////////////////////
harekat  proc
har: cmp   mot1,0
     jne   har_ret2
     cmp   len1,9
     je    har_ret2
     call  getkey
     call  detect
     cmp   mot,0
     jne   har1
     call  operatore
har1:
     cmp   al,'='
     je   har_ret1
     cmp  al,27
     je   har_ret
     jmp  har
har_ret:
     mov   ah,4ch
     int   21h
har_ret1:cmp   mot,0
  je    har
har_ret2:
     ret
harekat endp
;////////////////////////////////
amaliat  proc
mov    row,5
mov    col,55
mov    len1,0
mov    operate ,0
lea    si,oprand1
add    si,8
mov    mot,0
mov    mot1,0
call   harekat
mo2:
cmp    operate,0
jne    mo1
call   getkey
call   operatore
jmp    mo2
mo1:
mov    row,5
mov    col,27
call   cls2
mov    row,5
mov    col,55
mov    si1,9
mov    ax,word ptr len1
sub    si1,ax
lea    si,oprand2
add    si,8
mov    len1,0
mov    mot1,0
call   harekat
cmp   al,'='
je    play
ba:
mov  ah,00h
int   16h
cmp    al,'='
je     play
cmp    al,27
jne    ba
mov    ah,4ch
int    21h
play:
mov    di1,9
mov    ax,word ptr len1
sub    di1,ax
mai2:
    cmp   operate ,'-'
jne    kalc1
kalc_a:
    call  proc_sub
    call   cout1
    jmp    exit
kalc1:cmp  operate ,'/'
    jne   kalc2
kalc1_s:
     call  proc_div
    jmp   exit
kalc2:
    cmp  operate ,'*'
    jne  kalc3
    call   proc_zarb
    call   cout1
      jmp  exit
kalc3: cmp    operate ,'+'
       jne  exit
    call   proc_jam
    call   cout1
 exit:
ret
amaliat  endp
;//////////////////////////////
cout_char  proc
      mov   ah,0
      push  ax
      mov  ch,0
      mov  cl,len1
      sub  col,cl
      mov  dh,row
      mov  dl,col
      inc   dl
      call gotoxy
c_char:
      cmp  cx,0
      je   c_char1
      call  re_makan
      mov   dl,col
      call  gotoxy
      call  cout
      add   dl,2
      mov   col,dl
      dec   col
      call  gotoxy
      dec   cx
      jmp   c_char
c_char1:
      pop   ax
      mov   dh,5
      mov   dl,55
      call  gotoxy
      call  cout
      ret
cout_char   endp
;/////////////////////////////
shekl   proc
    push ax
    push cx
    push dx
 mov   dl,26
 mov   dh,4
 mov   col,dl
 mov   row,dh
 call  gotoxy
 mov   cx,9
 lea   dx,ja0
   jad: mov   ah,09h
 int   21h
 add   dx,32
 push  dx
 inc   row
 mov   dh,row
 mov   dl,col
 call  gotoxy
 pop   dx
 loop  jad
    pop  dx
    pop  cx
    pop  ax
 ret
shekl  endp
;////////////////////////////
gotoxy  proc
  mov  ah,02h
  int  10h
ret
gotoxy   endp
;////////////////////////////
cout  proc
  mov  ah,0eh
  int  10h
ret
cout  endp
;////////////////////////////
getkey   proc
mov   ah,07h
int  21h
ret
getkey   endp
;////////////////////////////
re_makan  proc
mov  ah,08h
int 10h
ret
re_makan   endp
;////////////////////////////
proc_jam   proc
    mov  mot,0
    mov  len3,0
    lea  si,oprand1
    lea  di,oprand2
    call norm
    mov  cx,9
jam_2: cmp  si1,0
    jg  jam7
    mov  al,0
    jmp  jams
jam7: mov  al,[si]
jams:mov  ah,0
    cmp  di1,0
    jle  jamd
    mov  ah,[di]
jamd:
    add  ah,al
    add  ah,mot
    mov  mot,0
    cmp  ah,10
    jl   jam1
    sub  ah,10
    mov  mot,1
    jmp  jam3
jam1:
    mov  mot,0
jam3:
    add  ah,'0'
    mov  [bx],ah
    inc  len3
    inc  si
    inc  di
    dec  bx
 dec  si1
 dec  di1
 loop  jam_2
jam_cha:mov  al,mot
   add  al,'0'
   mov  [bx],al
    ret
proc_jam  endp
;//////////////////////////////
  proc_sub    proc
   mov  mot,0
   mov  di,si1
   cmp  di,di1
   jg   menha0_3
   cmp  di,di1
   jl   menha_1
   lea  si,oprand1
   add  si,8
   lea  di,oprand2
   add  di,8
menha0_4:
   mov  al,[di]
   cmp  [si],al
   jl   menha0_3
   dec  si
   dec  di
   loop  menha0_4
   jmp   menha_1
menha0_3:
   mov  al,operate
   mov  sign,al
   mov  di,si1
   mov  si,di1
   mov  si1,si
   mov  di1,di
   lea  si,oprand2
   lea  di,oprand1
   jmp  menha_2
menha_1:
   lea  si,oprand1
   lea  di,oprand2
menha_2:
   mov  len3,0
   call  norm
   mov  cx,si1
menha2:
   cmp  di1,0
   jg  menha3
   mov  al,0
   jmp  men1
menha3:mov  al,[di]
men1:
   mov  ah,0
   cmp   si1,0
   jg   menha6
   jmp  menha_ret
menha6: mov  ah,[si]
  inc  len3
   cmp  ah,al
   jge   menha1_1
 mov   mot2,si
menha3_6:mov   dl,0
 inc   si
 cmp   [si],dl
 jne   menha3_3
 mov   dl,9
 mov   [si],dl
 jmp   menha3_6
menha3_3:mov  dl,1
   sub  [si],dl
   mov  si,mot2
   add  ah,10
   jmp  menha1_1
menha1_1:
 sub  ah,al
 add  ah,'0'
 mov  [bx],ah
 inc  si
 inc  di
 dec  bx
 dec  si1
 dec  di1
 loop menha2
menha_ret:
 ret
proc_sub  endp
;////////////////////////////
proc_zarb   proc
       lea  si,oprand1
       lea  di,oprand2
       call norm
       mov  mot,0
       mov  cl,10
       mov  ax,si1
       mov  mot2,ax
       mov  len3,bl
 con:
       cmp   di1,0
       je    zarb_ret
       push  bx
       push  si
       mov   dl,[di]
 l1:
       cmp si1,0
       je l2
       mov ch,mot
       mov cl,[bx]
       sub cl,'0'
       add ch,cl
       mov al,[si]
       mov ah,0
       mul dl
       add al,ch
       mov  cl,10
       div cl
       mov mot,al
       add ah,'0'
       mov [bx],ah
       dec bx
       inc si
       dec si1
       jmp l1
 l2:   mov  dx,mot2
       mov  si1,dx
       mov  al,mot
       add  al,'0'
       mov  [bx],al
       mov  mot,0
       mov  len3,bl
       pop  si
       pop  bx
       dec  bx
       dec  di1
       inc  di
       jmp  con
 zarb_ret:lea  ax,natigeh
     add   ax,19
     mov   bh,0
     mov   bl,len3
     sub   ax,bx
     mov   len3,al
       ret
proc_zarb   endp
;////////////////////////////
proc_div   proc
  mov   count,0
  mov   al,byte ptr si1
  mov   len1,al
  mov   al,byte ptr di1
  mov   len2,al
  lea   si,oprand1
  lea   di,oprand2
  call  norm
  mov   mot2,si
  mov   mot3,di
;========
tagh_al1 :
   mov   ax,di1
   cmp   si1,ax
   jg    tagh1_1
   cmp   si1,ax
   je    tagh2
tagh_ret1:
   call  cout_taghsim
jmp  tagh_ret
;==========
   tagh2:mov   cx,si1
 lea   si,oprand1
 lea   di,oprand2
 add   si,8
 add   di,8
  tagh2_1:
 mov   al,[di]
 cmp   [si],al
 jg    tagh1
 cmp   [si],al
 jl    tagh_ret1
 dec   si
 dec   di
 loop  tagh2_1
 inc   count
 jmp   tagh_ret1
;==========
tagh1:   mov   di,mot3
 mov   si,mot2
tagh1_1:
 mov   len3,0
 mov   cx,di1
tagh3_2:
 mov   al,[di]
 cmp   [si],al
 jge   tagh3
 mov   bx,si
tagh3_6: mov   ah,0
 inc   bx
 cmp   [bx],ah
 jne   tagh3_3
 mov   ah,9
 mov   [bx],ah
 jmp   tagh3_6
tagh3_3:
 mov   ah,1
 sub   [bx],ah
 mov   ah,10
 add   [si],ah
tagh3:
 sub   [si],al
 inc   si
 inc   di
 loop  tagh3_2
;==============
 lea   si,oprand1
 add   si,8
tagh5_3: mov   ah,0
 cmp   [si],ah
 jne   tagh3_4
 dec   si
 mov   bx,si1
tagh5_2: mov   al,[si]
 mov   [si+1],al
 dec   si
 dec   bx
 cmp   bx,0
 jne   tagh5_2
 inc   len3
 dec   si1
 lea   si,oprand1
 add   si,8
 jmp   tagh5_3
;==============
tagh3_4:
     inc   count
     mov   ax,65000
     cmp   count,ax
     jne   d2
     mov   count,0
     inc   ka_ge
d2:  cmp   si1,0
     jne   d1
     jmp   tagh_ret1
d1:  mov   si,mot2
     mov   di,mot3
     mov   ah,0
     mov   al,len3
     add   si,ax
     mov   len3,0
     mov   mot2,si
     jmp   tagh_al1
tagh_ret:
ret
proc_div   endp
;////////////////////////////
norm  proc
       mov  cx,9
       add  si,si1
       sub  cx,si1
       mov  si1,cx
       mov  cx,9
       add  di,di1
       sub  cx,di1
       mov  di1,cx
       lea  bx,natigeh
       add  bx,19
ret
norm   endp
;////////////////////////////
cout1  proc
    call  cls2
    mov   col,27
    mov   row,5
    mov  cl,len3
    mov  ch,0
    inc  cx
    mov  mot,0
    mov  mot1,0
    mov  al,sign
    call  cout_ch
cout2:mov  al,[bx]
    cmp  al,'0'
    je   cout_1
    mov  mot,1
cout_1:
    cmp   mot,0
    jne   cout4
    inc   mot1
   jmp   cout5
cout4:
    call  cout_ch
cout5:
    inc   bx
    loop   cout2
 cout6: mov  al,len3
 inc  al
 cmp  mot1,al
 jne  cout7
 mov  al,'0'
 dec  col
 call  cout_ch
cout7:
ret
 cout1   endp
;////////////////////////////
cout_taghsim  proc
  mov   col,27
  mov   row,5
  call  cls2
  call  start1
  mov   ah,0
  mov   ax,ka_ge
  lea   si,oprand1
  add   si,5
  call  bintoascy
  lea   si,oprand2
  add   si,4
  mov  ax,65000
  call  bintoascy
  mov   si1,4
  mov   di1,5
  call  proc_zarb
  mov   si,0
  mov   cx,9
a1:mov  oprand2[si],0d
   mov  oprand1[si],0d
   inc   si
  loop  a1
  mov   ax,count
  lea   si,oprand2
  add   si,4
  call  bintoascy
  mov   ch,0
  mov   cl,len3
  mov   si,8
  mov   di,20
  sub   di,cx
di_ch:
  mov   al,natigeh[di]
  sub   al,'0'
  mov   oprand1[si],al
  dec   si
  inc   di
  loop  di_ch
  mov   si1,9
  mov   ah,0
  mov   al,len3
  sub   si1,ax
  mov   di1,4
  call  proc_jam
  call  cout1
ret
cout_taghsim   endp
;////////////////////////////
cls2  proc
mov  dh,5
mov  dl,26
c1: mov  al,' '
 inc  dl
 call  gotoxy
 call cout
 cmp  dl,55
 jne  c1
 ret
cls2  endp
;////////////////////////////
start  proc
mov   si1,0
mov   di1,0
mov   ka_ge,0
mov   len1,0
mov   len2,0
mov   len3,0
mov   mot3,0
mov   mot2,0
mov   mot1,0
mov   mot,0
mov   sign,0
mov   operate,0
call  start1
mov  col,27
mov  row,5
call  cls2
ret
start   endp
;=================
start1  proc
mov  si,0
mov   cx,9
res:
mov  al,0
mov  oprand1[si],al
mov  oprand2[si],al
inc  si
loop  res
mov  si,0
mov  cx,20
res1:
mov  al,'0'
mov natigeh[si],al
inc   si
loop res1
ret
start1  endp
;////////////////////////////
bintoascy  proc
mov  bx,10
back:mov    dx,0
     div    bx
     mov    [si],dl
     inc    si
     cmp    ax,0
     ja     back
  ret
bintoascy  endp
;///////////////////////////
cout_ch   proc
mov   dl,col
mov   dh,row
call  gotoxy
call  cout
inc   col
ret
cout_ch   endp
;///////////////////////////
end  calculator



اینهم برای دانلود 
Calc.zip
exe شو از لینک های زیر دانلود کنند
*mohammadsarbandi*@yahoo.com
*mohammadsarbandi*@gmail.com
http://sarbandi.persiangig.ir/CPP/

http://sarbandi.persiangig.ir/CPP/8-QUEENF.EXE
http://sarbandi.persiangig.ir/CPP/EIGH_QEENF1.EXE

----------


## taze_vared

> .model small
> .data
> oprand1    db   9   dup(0)
> oprand2    db   9   dup(0)         
> natigeh    db   20  dup('0')
>     len1     db   0
>     len2     db   0
>     len3     db   0
> col      db   0
> ...


بچه ها لطف میکنید این برنامه رو برای من توضیح بدید؟(مخصوصا قسمت های قرمز)
یه چیز دیگه من وقتی خودم یه تابع ضرب یا جمع نوشتم وقتی با cx و dx و...کار کردم حداکثر عددم تا 5 رقم میتونست باشه..اینجا چطوری تا 8 رقم رفته؟

----------


## taze_vared

یکی کمک کنه لطفا

----------


## محمدامین شریفی

بچه ها، یکی  می تونه بگه  معنی  متغییر های mot1,ka_ge,si1 [پست 18  هست]چی میشه؟
در ضمن .386 در 8086 کار نمیکنه؟دلیلش چیه؟

----------

