PDA

View Full Version : جمع با استفاده از multi-precision (چند دقتی)



hasti19
شنبه 30 آذر 1392, 10:24 صبح
چگونه به زبان اسمبلی با استفاده از multi-precision دو عدد که بیشتر از 9 رقم دارند را باهم جمع کنیم؟

Delphi Coder
دوشنبه 02 دی 1392, 17:43 عصر
از دستور adc استفاده کنید. این دستور اگر carry flag مقدارش 1 باشه 1 واحد به نتیجه اضافه میکنه. فرض کنید AL=0BAh و BL=9Bh و AH=0 و BH=0 در این حالت اجرای دستورات زیر:


ADD AL,BL
ADC AH,BH

ax مقدار 155 رو خواهد گرفت یعنی دقیقا معادل دستور add ax,bx.
جمع اول انجام میشه و carry flag مقدار 1 میگیره بعد روی نتیجه جمع بعدی تاثیر میزاره.

hasti19
سه شنبه 03 دی 1392, 05:17 صبح
مشکل من با اینه که نمیشه عدد بیشتر از 9 رقم رو توی رجیستر ax و حتی eax ریخت. باید حتما عدد رو تیکه تیکه کنم؟ و نمی دونم چطور بدون مشکل این کار رو بکنم. با روش string به مشکل برخوردم.

Delphi Coder
جمعه 06 دی 1392, 00:11 صبح
نیازی نیست اونها رو در ax یا eax بریزید. اگر string ها در مبنای 16 باشه کار ساده تره هر دو کاراکتر تبدیل به بایت میشه و بایت به بایت شروع میکنید به جمع کردن.
اگر هم string ها در مبنای 10 باشه باز هم مشکلی پیش نمیاد میتونید فلگ carry و دستور adc رو خودتون شبیه سازی کنید.

hasti19
پنج شنبه 26 دی 1392, 15:37 عصر
فقط کد بخش جمع توی اسمبلی نوشته شده.
و در مورد جمع هایی که کری رقم اخر دارند جواب نمیده. (مثلا 99+1 یا 999+1)

http://s5.picofile.com/file/8106693592/m_micro.txt.html


با تشکر از Delphi Coder

hasti19
شنبه 28 دی 1392, 18:43 عصر
این هم کد کامل جمع :



#include <iostream>
#include <stdio.h>
#include <conio.h>
using namespace std;
#define LIMIT 64
void main(){
char str1[64],str2[64],sum[64];
for(int i=0;i<64;i++){
str1[i]='0';
str2[i]='0';
sum[i]='0';
}
printf("please insert first number\n");
scanf(" %[^\n]", &str1[1]);


int str1len=0; //b dast avardane tule adad//
for(int i=0;i<64;i++){
if(str1[i] != '\0')
str1len++;
else{
cout<<str1len-1<<endl;
break;
}
}
//............
//adad2
scanf(" %[^\n]", &str2[1]);
int str2len=0;
for(int i=0;i<64;i++){
if(str2[i] != '\0')
str2len++;
else{
cout<<str2len-1<<endl;
break;
}
}
//int str1rlen=str1len-1;
//int str2rlen=str2len-1;//chon charachter akharesh null e,yeki azash kam mikonim.
//.........
/*
dar in ghesmat edx = ebtedaye reshteye sum(hamon majmoo ya natije) hast
esi , edi be tartib toole resteye str1 , str2
ecx ham toole reshteye sum(majmoo) dar nazar migirim
*/
_asm{
pusha
mov eax, 0
mov ebx, 0
mov ecx, 0
mov edx, 0
mov esi, 0
mov edi, 0
lea edx, sum
mov esi, str1len
mov edi, str2len
dec esi //chon charachter akharesh null e,yeki azash kam mikonim.
dec edi
mov ecx,esi //
cmp ecx,edi // toole har kodoom ke bishtar bood natije ham be hamonn tool dar nazar migirim
jae cnt0 //
mov ecx,edi //
cnt0:
mov byte ptr [ecx+edx+1],0 // entehaye reshteye sum charactere null mizarim
lb1:
xor bx,bx // BL=0 , BH=0 raghame reshteye aval BL va raghame reshteye 2vom BH hast inaro inja sefr mikonim ta agar be entehaye yeki az reshteha reside bashim mohasebat be ham narize
// in dastor moadele dastoorate mov bl,0 va mov bh,0 hast chon in ravesh optimize tare injoori neveshte shode doost dashtid mitoonid taghir bedid

or esi,esi // agar be entehaye reshteye aval residim in ghesmato bayad bikhial shod. hamon sefr hast khodesh. mishe be jaye in dastoor az cmp esi,0 estefade kard
je cnt1
lea eax, str1
mov bl, [eax + esi]
sub bl, 48d // tabdil az caractr b adad//
cnt1:
or edi,edi // agar be entehaye reshteye dovom residim in ghesmat ham bayad bikhial shod. BH sefr mimone. mishe be jaye in dastoor az cmp edi,0 estefade kard
je cnt2

lea eax, str2
mov bh, [eax + edi]
sub bh, 48d
cnt2:
add bl, bh
cmp bl,9
jle lnotcar // hassel b araye rikhte mishavad//
mov [edx + ecx - 1], '1' //carry ra dasti vared araye mikonim//
sub bl, 10 // carry ra az hasel kam mikonim... 14-10=4//
lnotcar:
mov bh,[ecx + edx]
add bh, bl
cmp bh,'9' // test baraye carry hengame jam ba carry. chon inja dar sum ma reshtamon ba character haye '0' ya '1' por shode va na adade 0 ya 1 pas ma ham ba character e '9' moghayese mikonim ke be kare ezafi niazi nabashe
jle lnotcar2
sub bh,10
mov byte ptr[ecx+edx-1],'1'
lnotcar2:
mov [ecx+edx],bh // natijeye jame argham dar sum neveshte mishavad
// ma midoonim ke dar soorati ke esi ya edi ya ecx sefr shod dige nabayad azashoon kam konim. chon ham sharte bala ke ba sefr moghayese kardim na motabar mishe va ham esi -1 (FFFFFFFFh) mishe va be jaye namalomi az memory eshare khahad kard va exception be vojood miad
or esi,esi // in dastoor zero flag ro set mikone dar soorati ke esi 0 bashe. mitoonid be jash az cmp esi,0 estefade konid amma chon in ravesh saritare man injori neveshtam
je cnt3
dec esi
cnt3:
or edi,edi
je cnt4
dec edi
cnt4:
or ecx,ecx
jz cnt5
dec ecx
cnt5:
or edi, edi // hala agar har kodom az inha sefr nashode halgha ro edame bede
jne lb1 // mishe be jaye in dastoorate "or" az "cmp edi,0" estefade kard

cmp esi,0
jg lb1

cmp ecx,0
jg lb1

end:
popa
}
int i=0;
printf("%s", sum);//charachter hash ro yeki yeki peymayesh va chap mikonim

//for(i;sum[i]!=NULL;i++){
// printf("%c", sum[i]);//charachter hash ro yeki yeki peymayesh va chap mikonim
//}

getch();
}

#David
چهارشنبه 13 فروردین 1393, 14:50 عصر
سلام برای دقت با 20 رقم هگز برنامه به چه صورت میشه ؟
برنامه جمع و تفریق و ضرب و تقسیم دو عدد دریافتی ( با دقت 20 رقم هگز ) در اسمبلی چی میشه ؟ :افسرده:
ببینم کیا میتونن جواب بدن :قهقهه: