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
(X86 (80286) Register Flags)
📌 نگاهی بهتر به X86 Flag Register

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

1️⃣ - Zero Flag 🫥 ZF

این Flag اصطلاحا زمانی تنطیم (Set) می‌شود که نتیجه آخرین دستورات (Instruction) حسابی (Arithmetic) که اجرا می‌شوند صفر (0) باشد.
کاربرد آن در کمک کردن به پردازنده (Processor) است که می‌تواند تشخیص دهد دو مقدار برابر هستند یا Countdown‌آن به صفر رسیده است.
به یاد داشته باشید در فلگ ZF، عملگر‌های منطقی (Logic Operation) و حسابی (Arithmetic Operation) نیز مانند XOR هم می‌تواند باعث ست شدن ZF بشود.

🐲🐲🐲🐲🐲🐲🐲🐲


2️⃣ - Carry Flag 🫥 CF

این فلگ زمانی تنظیم (Set) می‌شود که آخرین عملیات حسابی (Arithmetic Operation) که روی دو عدد صحیح بدون علامت (Two Unsigned Integers) انجام می شود، نتیجه آن خیلی بزرگ یا خیلی کوچک باشد که آن را خارج از محدوده می‌نامند (Out Of Range). به زبان دیگر، این فلگ زمانی برابر با 1 خواهد گرفت که جواب آن عملیات حسابی Out Of Range باشد به طوری که سایز Register بیشتر باشد و درون آن جای نگیرد.
برای مثال اگر در جمع (ADD) دو عدد جواب عملیات طوری بود که فیت (Fit) اندازه رجیستر (Register) نباشد فلگ CF ست می‌شود (برابر با 1 می شود)
حال اگر، تفریق (SUB) دو عدد جوابی کوچک‌تر از 0 را به ما نشان دهد، فلگ CF باز هم ست می‌شود و برابر با 1 قرار می‌گیرد.
در ریز‌پردازنده (Microprocessor) 80286 تعداد بیت‌های موجود 16 بیت است.

🐲🐲🐲🐲🐲🐲🐲🐲


3️⃣ - Overflow Flag 🫥 OF

این فلگ زمانی تنظیم (Set) می‌شود که یک عملیات روی اعداد صحیح علامت دار (Signed Integers) منجر به Overflow یا Underflow شود.

🐲🐲🐲🐲🐲🐲🐲🐲


4️⃣ - Sign Flag 🫥 SF

این فلگ زمانی تنظیم (Set) می‌شود که MSB یا (Most Significant Bit) برابر 1 باشد. می‌دانیم زمانی که MSB ما برابر با 1 است در نتیجه جواب یک عدد منفی (Negative).
به طور کلی اگر فلگ SF برابر با 0 باشد که نشان می‌دهد MSB هم 0 است، بیان‌گر این موضوع است که نتیجه ما یک عدد مثبت (Positive) یا صفر (0) است.
اگر فلگ SF برابر با 1 باشد که نشان می‌دهد MSB هم 1 است، بیان‌گر این موضوع است که نتیجه ما یک عدد منفی (Negative) است.

🐲🐲🐲🐲🐲🐲🐲🐲


5️⃣ - Parity Flag 🫥 PF

این فلگ زمانی تنظیم (Set) می‌شود که LSB یا (Least Significant Byte) یا به عبارت دیگر 8 بیت (Bits) اول نتیجه از سمت راست، تعداد 1‌های موجود در آن 8 بیت زوج (Even) باشد که در این صورت فلگ PF برابر با 1 قرار می‌گیرد و به آن همچنین (Even Parity) هم نیز گویند. حال اگر تعداد 1‌های موجود در LSB یا همان 8 بیت اول فرد (Odd) باشد بنابراین فلگ PF برابر با 0 خواهد بود که به آن همچنین (Odd Parity) هم نیز گویند.


🐲🐲🐲🐲🐲🐲🐲🐲


6️⃣ - Auxiliary Flag 🫥 AF

این فلگ زمانی تنظیم (Set) می‌شود که در بین 4 بیت (Bits) پایینی که به آن (Lower 4 Bits) هم می‌گویند، یک Carry یا یک Borrow رخ دهد. در این صورت فلگ AF برابر با 1 خواهد بود.
فلگ AF زمانی برابر با 0 خواهد بود که بین Lower 4 Bits هیچ Carry یا Borrow‌ای در طول عملیات رخ ندهد.

@ZeroX_0Day
Please open Telegram to view this post
VIEW IN TELEGRAM
3🔥11
(Overflow & Underflow 1/4)

📌سرریز (Overflow) و پاریز (Underflow) چیست و چه زمانی رخ می‌دهد؟

سرریز یا همان (Overflow) به این معناست که اگر با جمع (Addition) دو عدد مثبت (Positive) نتیجه عددی منفی (Negative) به دست آمد، بدان معناست که Overflow رخ داده است.

🔖نکته: ممکن است عملیات ضرب (Multiplication) هم باعث این موضوع شود.

در ریاضیات (Mathematics) جمع دو عدد Positive همواره Positive خواهد ماند اما در Computer چون برای نوع داده‎های (Data Types) اندازه (Size)‌های مختلفی در نظر گرفته شده است بنابراین اگر جمع آن دو عدد Positive از بالاترین مرز آن (Maximum Value) عبور کند در آن محدوده (Range) قابل نمایش نیست بنابراین به آن نتیجه، خارج از محدوده یا (Out Of Range) گویند.

برای مثال یک نوع داده‌ای داریم به اسم int که برای نمایش اعداد Integer استفاده می‌شود. همان‌طور که می‌دانید اعداد Integer همان اعداد صحیح هستند که در ریاضیات آن را با نمایش می‌دهیم.
به طور کلی اگر بخواهیم آن را با مجموعه (Sets) نمایش دهیم:
= {... , -4 , -3 , -2 , -1 , 0, 1 , 2 , 3 , 4, ...}

حال اگر تصور کنیم، سایز int‌ای که داریم 16 بیتی است، فقط می‌توانیم اعداد بین آن را نمایش دهیم.


🐲🐲🐲🐲🐲🐲🐲🐲

⁉️ چگونه این محدوده بر اساس تعداد Bit‌ ها مشخص می‌شود؟

در اعداد علامت دار (Signed Numbers)، برای اعداد حداقل (Minimum Value) از فرمول (2ⁿ⁻¹)- استفاده می‌‌کنیم. (به یاد داشته باشید مقدار n در اینجا مقدار Bits است.)
بنابراین:
-(2¹⁶⁻¹) = -32,768 —> Minimum Value

در اعداد علامت دار (Signed Numbers)، برای اعداد حداکثر (Maximum Value) از فرمول 2ⁿ⁻¹ - 1 استفاده می‌‌کنیم. (به یاد داشته باشید مقدار n در اینجا مقدار Bits است.)
بنابراین:

2¹⁶⁻¹ -1 = 32,767 —> Maximum Value


در نتیجه محدوده یا همان (Range)ای که برای int16 داریم می‌شود:
-32,768 🔤 32,767


🐲🐲🐲🐲🐲🐲🐲🐲

پاریز یا همان (Underflow) به این معناست که اگر با تفریق (Subtraction) دو عدد به نتیجه‌ای برسیم که آن منفی (Negative) باشد و همچنین از رنج و محدوده‌ای که برای آن در هر بیت تعریف شده کمتر باشد Underflow رخ داده است.

در پست بعدی بهتر می‌تونیم Overflow و Underflow را درک کنیم.

@ZeroX_0Day
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥211
0xDay
(Overflow & Underflow 1/4) 📌سرریز (Overflow) و پاریز (Underflow) چیست و چه زمانی رخ می‌دهد؟ سرریز یا همان (Overflow) به این معناست که اگر با جمع (Addition) دو عدد مثبت (Positive) نتیجه عددی منفی (Negative) به دست آمد، بدان معناست که Overflow رخ داده است.…
(Overflow & Underflow 2/4)

همانطور که می‌بینید یک متغیر از نوع و سایز int16_t و آن را به اسم MaximumValueOfInt16 نام گذاری کردیم و مقدار‌ دهی رو انجام دادیم.
اگر این مقدار را جمع با 1 کنیم می‌بینید که Overflow رخ می‌دهد و مقدار منفی به ما نشان می‌دهد.
// Example of Overflow
#include <stdio.h>
#include <stdint.h> // Needed to use for int16
int main() {
// Int16 is -32768 & +32767
int16_t MaximumValueOfInt16 = 32767; // +32767 is the Maximum in int16
printf("This is the Maximum Value in int Data Type and 16 bits: %d\n",MaximumValueOfInt16);
printf("This is an example of Overflow in int Data Type and 16 bits: %d\n",(int16_t)(MaximumValueOfInt16+1));
return 0;
}


@ZeroX_0Day
2
0xDay
(Overflow & Underflow 2/4) همانطور که می‌بینید یک متغیر از نوع و سایز int16_t و آن را به اسم MaximumValueOfInt16 نام گذاری کردیم و مقدار‌ دهی رو انجام دادیم. اگر این مقدار را جمع با 1 کنیم می‌بینید که Overflow رخ می‌دهد و مقدار منفی به ما نشان می‌دهد. //…
(Overflow & Underflow 3/4)

انجام مثال برای Underflow

تنها تفاوت در تفریق متغیر MinimumValueOfInt16 به 1 است.

// Example of Underflow
#include <stdio.h>
#include <stdint.h> // Needed to use for int16
int main() {
// Int16 is -32768 & +32767
int16_t MinimumValueOfInt16 = -32768; // -32768 is the Minimum in int16
printf("This is the Minimum Value in int Data Type and 16 bits: %d\n",MinimumValueOfInt16);
printf("This is an example of Underflow in int Data Type and 16 bits: %d\n",(int16_t)(MinimumValueOfInt16-1));
return 0;
}


@ZeroX_0Day
2
0xDay
(Overflow & Underflow 3/4) انجام مثال برای Underflow تنها تفاوت در تفریق متغیر MinimumValueOfInt16 به 1 است. // Example of Underflow #include <stdio.h> #include <stdint.h> // Needed to use for int16 int main() { // Int16 is -32768 & +32767 int16_t…
(Overflow & Underflow 4/4)

همچنین با استفاده از sizeof می‌توانیم متوجه Size یک Variable شویم.

// Example of Underflow
#include <stdio.h>
#include <stdint.h> // Needed to use for int16
int main() {
// Int16 is -32768 & +32767
printf("UNDERFLOW\n");
int16_t MinimumValueOfInt16 = -32768; // // -32768 is the Minimum in int16
printf("This is the Minimum Value in int Data Type and 16 bits: %d\n",MinimumValueOfInt16);
printf("This is an example of Underflow in int Data Type and 16 bits: %d\n",(int16_t)(MinimumValueOfInt16-1));
printf("Size of MinimumValueOfInt16: %d Bits\n\n\n",sizeof(MinimumValueOfInt16) * 8);

printf("OVERFLOW\n");

int16_t MaximumValueOfInt16 = 32767; // +32767 is the Maximum in int16
printf("This is the Maximum Value in int Data Type and 16 bits: %d\n",MaximumValueOfInt16);
printf("This is an example of Overflow in int Data Type and 16 bits: %d\n",(int16_t)(MaximumValueOfInt16+1));
printf("Size of MaximumValueOfInt16: %d Bits\n",sizeof(MaximumValueOfInt16) * 8);
return 0;
}


@ZeroX_0Day
411
Media is too big
VIEW IN TELEGRAM
صحبت‌های رامتین خسروی راجب مهندسی نرم افزار.

@ZeroX_0Day
3
(Binary Addition & Show The X86 Flag Registers 1/11)

📌 نحوه انجام جمع (Addition) در سیستم باینری (Binary) و مشخص کردن فلگ رجیستر‌ها

اگر فرض کنیم دو عدد در مبنا Hexadecimal یا همان مبنا 16 داریم و از ما خواسته شده است آن‌هارا با هم جمع (Addition) کنیم چطوری باید این کار رو انجام داد؟

برای مثال اعداد فرضی که داریم 3CD6 و 5B9C است:
3CD6 + 5B9C

ابتدا باید هر 2 عدد را تبدیل به 0 یا 1، یا به عبارتی بهتر تبدیل به سیستم Binary کرد.
می‌دانیم Hexadecimal شامل اعداد 0-9 و همینطور حروف A-F می‌شود.
Hexadecimal:
0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E, F


اکنون باید بدانیم هر کدام یک از حروف‌های Hexadecimal برابر با چه مقداری است.
A: 10
B: 11
C: 12
D: 13
E: 14
F: 15


🐲🐲🐲🐲🐲🐲🐲🐲

حال که با موارد ابتدایی در دنیای Hexadecimal آشنا شدیم، برای تبدیل آماده‌ایم:
برای 3CD6 به شکل زیر عمل می‌کنیم:
3CD6 (Hexadecimal):
3 (Hexadecimal) —> 3
C (Hexadecimal) —> 12
D (Hexadecimal) —> 13
6 (Hexadecimal) —> 6

بنابراین به نتیجه زیر می‌رسیم:
3 12 13 6

برای درک بهتر در عکس نحوه تبدیل در پست بعدی نشان داده شده است.

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