0xDay – Telegram
0xDay
57 subscribers
25 photos
1 video
8 links
Interested in Low-Level, Networking, Unix-Based platforms & occasionally Mathematics.
Download Telegram
Channel created
(Two's Complement 1/2)
شاید براتون سوال شده باشه Computer چطوری میاد عملیات Subtract یا همون تفریق رو انجام می‌ده؟
کامپیوتر جمع رو می‌تونه راحت جمع انجام بده اما تفریق رو وقتی بهش میدی دیگه مثل حالت عادی عملیات رو انجام نمی‌ده.
بر فرض مثال داریم:
25 - 18

انسان راحت می‌تونه حساب کنه که می‌شه 7
اما کامپیوتر چطور حساب می‌کنه؟
کامپیوتر میاد همین عملیات رو تبدیل به جمع می‌کنه، اما چطوری؟ (باید بگم ممنون شما چطوری؟)
واسه اینکه این عملیات تفریق تبدیل به عملیات جمع بشه عدد دوم که تو مثال ما 18 هست باید منفی بشه. پس کامپیوتر چنین کاری می‌کنه:
25 + (-18)



خب 25 که همونه، یه عملیات Operator عوض شده و یه علامت 18 که شده 18-
بریم ببینیم چطوری 18 می‌شه 18-

خیلی سادست. یه چیزی داریم به اسم مکمل 1 که با One's Complement شناخته می‌شه. یه چیز دیگه هم داریم به مکمل دو که با Two's Complement شناخته می‌شه.
کامپیوتر برای انجام هر عملیات تفریقی از روش Two's Complement استفاده می‌کنه.
از اونجایی که می‌دونیم زبان ماشین فقط و فقط 0 و 1 رو درک می‌کنه پس باید عدد رو تبدیل به Binary کنیم. خب 18- رو که بلد نیستیم حساب کنیم، بزار اول بیایم روی 18 کار کنیم. (نتیجه: پس هر عددی به ما دادن منفی بود در نظر نمی‌گیریم و می‌ریم سراغ همون عدد اما از نوع مثبتش)

واسه تبدیل کردن عدد 18 به Binary راحت ترین حرکت استفاده از توان های 2 یا به عبارت دیگه‌ای Two Powers هست. (تقسیم چکشی متوالی 2 هم هست اما روش به درد نخوری هست)

از اونجایی که می‌خوام تا bit 8 حساب کنم پس تا 7^2 رو می‌نویسم که میشه 128

128 64 32 16 8 4 2 1

خب حالا میام می‌گم کدوم یکی از این توان‌های 2 از 18 کمتره؟
منطقا می‌شه 16. پس میام یه تفریق ریز انجام می‌دم.
18 - 16 = 2

حالا این عدد 2 که حاصل تفریق ما شد به کدوم یکی از این توان‌های دو می‌خوره؟ یه توان 2 داریم پس منها می‌کنیم.
2 - 2 = 0

خب حاصل 0 شد، در نتیجه بریم سراغ توان‌‌ 2‌هایی که ازشون استفاده کردیم. 16 و 2 رو برابر با 1 قرار می‌دیم، توان 2‌هایی که استفاده نکردیم رو همه رو 0 می‌زاریم. بنابراین می‌شه:
128   64   32    16     8     4     2    1
0 0 0 1 0 0 1 0


(00010010) 



خب حالا که تبدیل رو انجام دادیم، 25 رو هم تبدیل می‌کنیم چون به هر دو عدد برای تفریق نیاز داریم:

128   64   32  16   8  4   2   1
0 0 0 1 1 0 0 1


(00011001)



گفتیم کامپیوتر میاد علامت عدد دومی که تو مثال ما 18 هست رو تغییر می‌ده می‌کنه -18، چطوری؟
اول میایم One's Competent انجام می‌دیم.
چطوری؟ باید بیایم عدد Binary که به دست اوردیم رو به اصطلاح Invert کنیم یا معکوس کنیم.

حالا معکوس یعنی چی؟ یعنی به جای 0 عدد 1 بگذاریم و به جای 1 عدد 0.
18 in Binary:
00010010
Inverted:
11101101

پس معکوس ما شد 00010010
حالا که مرحله One's Complement رو انجام دادیم، می‌ریم سراغ مرحله Two's Complement:
چطوری؟ به معکوس شده میایم یکی اضافه کنیم یعنی 1+:
    11101101             
+ 1
-----------


جمع دو عدد Binary:
از سمت راست به سمت چپ.
سمت راست داریم 1+1.
خب منطقا در ریاضیات میدونیم جمع 1+1 میشه 2 اما اینجا دنیای Binary هست و رنج اعدادی که داریم فقط 0 و 1 هست.
برای راحتی در گفتار می‌تونیم بگیم 1 + 1 شده 10.
حالا 0 رو می‌زاریم و 1 باقی مانده رو میدیم سمت چپی که اصطلاحا می‌گن این 1 اینجا Carry شده.
پس بعدی میشه 0 + 1 Carry که میشه خود 1.
دیگه چیزی نداریم پس بقیه اعداد رو خودش رو مینویسیم:
               1
11101101
+ 1
---------------------
11101110

حالا که عدد 18 رو ماهم مثل کامپیوتر کردیم 18- میریم سراغ جمع کردنش:


    00011001    —> 25
+ 11101110 —> -18
————————————----
1000000111


@ZeroX_0Day
👍1
(Two's Complement 2/2)
چطوری اینطوری شد؟
خب میایم اول میگیم 0 + 1 که می شود 1 پس قرار میگیره اون پایین.
بعدش باز میگیم 0 + 1 که می شود 1 پس قراره میگیره اون پایین.
باز دوباره 0 + 1 که می شود 1 پس قرار میگیره اون پایین.
حالا اینجا داریم 1 + 1 که گفتیم فرض میکنیم تو گفتار داریم میگیم میشه 10 پس 0 رو مینویسیم پایین 1 می شود Carry میدیم به سمت چپی.
حالا داریم 0 + 1 که می شود 1 اما یه 1 Carry هم بالاش داریم پس میشه 10 که باز 0 رو مینویسیم 1 می شود Carry میدیم به سمت چپی.
بعدش میرسیم به 0 + 1 که می شود 1 اما باز داریم میبینم بالاش یه 1 Carry هست که باز می شود 10 که باز 0 رو مینویسیم همچنان 1 Carry میشه میدیم به سمت چپی.
در اخر میرسیم به 0 + 1 که میدونیم میشه 10 اما یه 1 Carry داریم که میشه 10 و اینجا میبینم دیگه سمت چپ تمومه پس چیزی نداریم که بخوایم 0 رو بنویسیم و 1 رو دوباره Carry کنیم. بنابراین خود 10 رو کامل مینویسیم که میشه:
100000111

میبینیم که تعداد ارقام شده 9 در حالی که قبلا 8 بود. پس اون 9امی که اینجا 1 هست رو خط میزنیم و در نظر نمیگیریم:
00000111

حالا میایم با استفاده از توان های 2 حساب میکنیم ببینم این عدد چنده:
128   64   32    16   8   4  2    1 
0 0 0 0 0 1 1 1

پس داریم (اونایی که 1 هست خونه‌هاش رو جمع میکنیم):
4 + 2 + 1 = 7.


خب (18-)+25 می شود 7. جوابی که انسان هم یکی در میاد و دیدیم که کامپیوتر چطوری حساب میکنه و به این عدد میرسه.

References:
- https://en.wikipedia.org/wiki/Two%27s_complement
- https://www.cs.cornell.edu/~tomf/notes/cps104/twoscomp.html#:~:text=Two's%20complement%20is%20the%20way,add%20one%20to%20the%20result.
- https://stackoverflow.com/questions/1049722/what-is-twos-complement
- https://www.freecodecamp.org/news/microprocessors-romance-with-integers/#:~:text=The%20leftmost%20or%20the%20most,tells%20us%20the%20actual%20magnitude.


@ZeroX_0Day
اگه براتون سوال هست Bit و Byte چی هستند می‌تونید به این مطلب از بیشتر بدانیم فیزیک (1) - صفحه 13 از رشته ریاضی فیزیک پایه دهم یه نگاهی بندازید.

@ZeroX_0Day
(Matrix 1/5)
ماتریکس چیست و کاربرد آن در Computer Science چه چیزی است؟

- اول بیایم یک تعریف از Matrix داشته باشیم تا بهتر بتونیم درکش کنیم:

ماتریکس به یک آرایش مستطیل (به آرایش مستطیلی Rectangular Array هم گویند) شکلی از اعداد یا عبارت‌های ریاضی گویند که به صورت سطر و ستون نوشته بشه - یعنی جوری که هر ستون یا هر سطر در ماتریکس، یک بردار را تشکیل بده.
به اعداد یا عبارت یا به طور کلی هر چیزی که داخل Matrix قرار گیرد یک عنصر یا یک Element گویند که برای نشان دادن یک Mathematical Object یا Property Of An Object استفاده می‌شود.
به هر یک از عناصر داخل ماتریکس به زبان فارسی دِرایه گویند.
سطر رو Rows نشان می‌دهیم و ستون رو Columns می‌نامیم.
از حرف m برای سطر و حرف n برای ستون استفاده می‌کنیم که در نتیجه برسیم به m×n

بنابراین: m می‌شود Rows که به صورت افقی یا همان Horizontal و همچنین n می‌شود Columns که به صورت عموی یا همان Vertical است.
Rows —> Horizontal
Columns —> Vertical

کاربرد Matrix رو میشه توی یک سری از Algorithmsهای مهم تو زمینه CS دونست. برای مثال یکی از کاربرد‌‎های Matrix زمانی هست که Graphic از Matrix برای Process و پردازش عکس مورد نظر ما به عنوان نتیجه نهایی ‌می‌کنه.

@ZeroX_0Day
🔥4
0xDay
(Matrix 2/5) نحوه نمایش ماتریکس A. @ZeroX_0Day
(Matrix 3/5)
چگونه یک عنصر یا Element در ماتریکس A را تشخیص دهیم؟

@ZeroX_0Day
0xDay
(Matrix 3/5) چگونه یک عنصر یا Element در ماتریکس A را تشخیص دهیم؟ @ZeroX_0Day
(Matrix 4/5)

نحوه پیاده سازی ماتریکس A که تو مثال بالا داشتیم در C با استفاده از آرایه‌های 2 بعدی. (2D Arrays)


@ZeroX_0Day
(Register Flags 1/1)
ثبات پرچم یا همان Register Flag چیست؟

رجیستر فلگ چیزی هست که داخل Central Processing Unit (CPU) یا همون پردازنده هست که یک سری Bit رو نگه‌‌داری می‌کنه که این Bit‌ها نمایش دهنده وضعیت‌ عملیلت‌های مختلفی هست که CPU انجام داده.

حالا در معماری X86 رجیستر فلگ 16 بیت (Bit) هست که شامل اطلاعاتی هست که پس از انجام یک کاری انجام شده. به این اطلاعات وضعیت پرچم یا Status Register هم گویند به این دلیل که نتیجه آخرین عملیات اجرا شده توسط CPU رو نشون می‌ده. حالا این فلگ‌ها به بیت‌های مختلفی تقسیم می‌شن که هر Bit نشان دهنده یک Flag یا به اصطلاح نشان دهنده وضعیت است.
رجیستر فلگ‌های مهمی داریم مثل:

1 - Carry Flag 🫥 CF
2 - Zero Flag 🫥ZF
3 - Sign Flag 🫥 SF
4 - OverFlow Flag 🫥 OF
5 - Parity Flag 🫥 PF
6 - Auxiliary Carry Flag 🫥 AF


حالا که با فلگ‌های مهم آشنا شدیم، باید بدونیم نسبت به هر عملیاتی که توسط CPU مثل عملیات حسابی (Arithmetic) - عملیات منطقی (Logical Operations) انجام می‌شه مقدار اون Flag‌ها به 0 یا 1 تغییر می‌کند.

توضیح هر Register Flag:

1 - اگر در فلگ Carry Flag که آن را با CF نشان می‌دهیم، یک Carry از Most Significant Bit (MSB) هنگام جمع (Addition) به دست آوریم یا همینطور تفریق (Subtraction) که یک Borrow در MSB داریم مقدار CF را 1 قرار می‌دهیم اما در غیر این صورت مقدار CF برابر با 0 خواهد بود.

2 - اگر در فلگ ZF نتیجه برابر با 0 بود مقدار ZF می شود 1 اما برای نتیجه‌ای که 0 نیست یا به اصطلاح Non-Zero است مقدار ZF برابر با 0 است.

3 - اگر در فلگ SF مقدار MSB برابر 1 باشد بنابراین مقدار SF هم 1 است اما اگر مقدار MSB برابر با 0 قرار گرفت مقدار SF هم 0 می شود.

4 - اگر در فلگ OF سر ریز بافر رخ دهد مقدار OF برابر با 1 است اما در غیر این صورت مقدار OF برابر با 0 خواهد بود.

5 - اگر در فلگ PF تعداد Low Byte زوج یا همان Even باشد مقدار PF برابر با 1 است اما اگر تعداد Low Byte فرد یا Odd بود بنابراین مقدار PF هم برابر با 0 خواهد بود.

6 - اگر در فلگ AF عملیات حسابی یا همان (Arithmetic Operations) یک Carry یا یک Borrow رخ دهد مقدار AF برابر با 1 است در غیر این صورت مقدار AF برابر با 0 خواهد بود.

References:
- https://en.wikipedia.org/wiki/FLAGS_register
- https://www.geeksforgeeks.org/flag-register-8086-microprocessor/
- https://www.cs.princeton.edu/courses/archive/fall09/cos375/IA32StatusFlags.pdf
- https://stackoverflow.com/questions/73362953/how-is-the-overflow-flag-not-set-after-this-addition
- https://www.eecg.toronto.edu/~amza/www.mindsec.com/files/x86regs.html
- https://www.cs.uaf.edu/2009/fall/cs301/lecture/12_07_flags.html


@ZeroX_0Day
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
7🔥222
ممکنه براتون سوال پیش بیاد در معماری X86 چه نوع Registerهایی وجود داره؟

همینطور که می‌دونید X86 به معنی 32 بیت (Bits) هست که چنین Register‌هایی داریم که 8تای آنها رجیستر‌های عمومی 32 بیتی (Bits) یا General Purpose Registers نام دارند. (نکته: در عکس اول RAX رو برای مثال آوردم که مربوط به معماری X64 هست و بنابراین 64 Bits هست.)
1. EAX
2. EBX
3. ECX
4. EDX
5. ESI
6. EDI
7. ESP (Stack Pointer)
8. EBP (Base Pointer)



رجیستر‌‌های (Registers) 16 بیتی (Bits):
1. AX
2. BX
3. CX
4. DX
5. SI
6. DI
7. SP
8. BP


رجیستر‌‌های (Registers) 8 بیتی (Bits):
1. AH AL
2. BH BL
3. CH CL
4. DH DL

References:
- https://www.cs.virginia.edu/~evans/cs216/guides/x86.html
- https://www.nayuki.io/page/a-fundamental-introduction-to-x86-assembly-programming
- https://www.geeksforgeeks.org/general-purpose-registers-8086-microprocessor/
- https://www.eejournal.com/article/mastering-x86-memory-segmentation/
- https://www.tutorialspoint.com/what-are-the-cpu-general-purpose-registers


@ZeroX_0Day
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
2👍1