נושאים פעיליםנושאים פעילים  הצגת רשימה של חברי הפורוםרשימת משתמשים  חיפוש בפורוםחיפוש  עזרהעזרה
  הרשמההרשמה  התחברותהתחברות RSS עדכונים
תיכנות
RSS UnderWarrior Forums : RSS תיכנות
נושא

נושא: הדפסת מספר דו ספרתי באסמבלי

שליחת תגובהשליחת נושא חדש
כותב
הודעה << נושא קודם | נושא הבא >>
גלעד
אורח
אורח


הצטרף / הצטרפה: 01 October 2003
משתמש: אונליין
הודעות: 12647
נשלח בתאריך: 04 May 2005 בשעה 08:23 | IP רשוּם
ציטוט גלעד

יש לי בעיה, אני לא מצליח להדפיס את המספר 16 כשהוא מיוצג בבינארית ב 4^2.

כאשר אני מנסה להפריד בין שתי הספרות עם SHR ו AND אני מקבל שהסיפרה השמאלית היא 0 והימנית היא 1 מכיוון שיש לי רק ביט אחד דלוק במיקום החמישי (שתיים בחזקת ארבע).

למישהו יש רעיון?

 

חזרה לתחילת העמוד הצג את כרטיס החבר של גלעד חפש הודעות אחרות של גלעד בקר בדף הבית של גלעד
 
Lib1
משתמש פעיל
משתמש פעיל
סמל אישי

הצטרף / הצטרפה: 03 May 2005
מדינה: Israel
משתמש: מנותק/ת
הודעות: 73
נשלח בתאריך: 04 May 2005 בשעה 23:02 | IP רשוּם
ציטוט Lib1

תנסה את הפקודות הבאות *  ctrl+shift (משמאל לימין) כדי לקרוא טוב!

קוד:
      mov   al,16     & ;nbs   p;         & ;nbs p;     ; al =16

      aam         &am p;nb   sp;         &am p;nb sp;          ; al/10, al = 6, ah = 1

    or        ax,3030h        & ;nbs p;          ; al = 36h = התו 6 , ah= 31h = התו 1

    הדפסת הערך שנמצא ב ah

    הדפסת הערך שנמצא ב al

* יש לציין שזו שיטה מאוד מאוד מאוד איטית יחסית לשיטות אחרות (ויש!) אבל אני לא זוכר כרגע שיטה מהירה יותר

חזרה לתחילת העמוד הצג את כרטיס החבר של Lib1 חפש הודעות אחרות של Lib1
 
ניר
מנהל האתר
מנהל האתר
סמל אישי

הצטרף / הצטרפה: 12 January 2005
מדינה: Israel
משתמש: מנותק/ת
הודעות: 3296
נשלח בתאריך: 04 May 2005 בשעה 23:05 | IP רשוּם
ציטוט ניר

אפשר להשתמש בתג [code] על מנת לעצב את הקוד כמו שצריך. ראה את קודי הפורום לאפשרויות נוספות
חזרה לתחילת העמוד הצג את כרטיס החבר של ניר חפש הודעות אחרות של ניר בקר בדף הבית של ניר
 
חגי
אורח
אורח


הצטרף / הצטרפה: 01 October 2003
משתמש: אונליין
הודעות: 12647
נשלח בתאריך: 04 May 2005 בשעה 23:43 | IP רשוּם
ציטוט חגי

מעניין שהתוצאה הראשונה בגוגל על חיפוש ההוראה aam מוצא אותה ב-undocumented opcodes :)

חזרה לתחילת העמוד הצג את כרטיס החבר של חגי חפש הודעות אחרות של חגי בקר בדף הבית של חגי
 
חגי
אורח
אורח


הצטרף / הצטרפה: 01 October 2003
משתמש: אונליין
הודעות: 12647
נשלח בתאריך: 04 May 2005 בשעה 23:47 | IP רשוּם
ציטוט חגי

שכחתי לומר לגלעד -
אני חושב שאתה לא יכול להפריד בין ספרות עשרוניות עם shr כי הוא מחלק רק בחזקות של 2 ואתה צריך חלוקה ב-10. (אבל אולי יש טריק שאני לא מכיר)
אגב אני מכיר טריק לכפל ב-10 בעזרת shl:
זה הולך משהו כמו:
קוד:

mov ebx, eax;     ebx = eax
shl ebx, 2          ;     ebx = eax * 4
add ebx, eax     ;     ebx = eax * 5
shl ebx, 1          ;      ebx = eax * 10


חזרה לתחילת העמוד הצג את כרטיס החבר של חגי חפש הודעות אחרות של חגי בקר בדף הבית של חגי
 
Lib1
משתמש פעיל
משתמש פעיל
סמל אישי

הצטרף / הצטרפה: 03 May 2005
מדינה: Israel
משתמש: מנותק/ת
הודעות: 73
נשלח בתאריך: 05 May 2005 בשעה 02:29 | IP רשוּם
ציטוט Lib1

לחגי:


הפקודה  AAM =  ASCII Ajdust after Multiply


היא באמת לא מתועדת (משום מה)


היא מבצעת חילוק של al ב-10. השארית ב-al והשלם ב-ah


אני יגלה לך עוד סוד קטן שאינטל שוב הסתירה משום מה.


חלק מהקידוד של הפקודה aam הוא 0Ah = 10


כלומר החלק הזה אומר בכמה לחלק!!!


אם נשנה חלק מה-Opcode אפשר לקבוע שהוא יחלק ב 9,8,5 וכו... וכל זאת בפקודה אחת!


אבל.... זהו שינוי לא רגיל ולכן כשמשנים את המחלק (במקום 10) יש לבצע זאת ע"י הפקודה:


קוד:
db D4 ??


הסימני שאלה מחליפים את המחלק (במקום 0Ah)


אבל אני חוזר שהיא פקודה איטית ביותר!

חזרה לתחילת העמוד הצג את כרטיס החבר של Lib1 חפש הודעות אחרות של Lib1
 
Lib1
משתמש פעיל
משתמש פעיל
סמל אישי

הצטרף / הצטרפה: 03 May 2005
מדינה: Israel
משתמש: מנותק/ת
הודעות: 73
נשלח בתאריך: 05 May 2005 בשעה 05:25 | IP רשוּם
ציטוט Lib1

חגי, הטריק שנתת הוא נפוץ מאוד והסיבה לכך שהפקודה mul היא איטית בצורה מחרידה (יחסית לפקודות add וכו...)

ככלל הפקודות mul,imul,div,idiv  הם מאוד איטיות ולכן אלו שרוצים קוד מהיר עם אופטימיזציה מקסימלית נמנעים כמה שיותר מלהשתמש בפקודות הנ"ל (במידת האפשר כמובן), לכן כל הטריקים המאוד יעילים כמו הדוגמא שהבאת

חזרה לתחילת העמוד הצג את כרטיס החבר של Lib1 חפש הודעות אחרות של Lib1
 
רוית
אורח
אורח


הצטרף / הצטרפה: 01 October 2003
משתמש: אונליין
הודעות: 12647
נשלח בתאריך: 18 November 2005 בשעה 21:26 | IP רשוּם
ציטוט רוית

היי,

אילו טריקים יש לחלוקת מספרים שלא ע"י שימוש בפקודת ה-DIV? (וחוץ מהלהפחית מסםר אחד מהשני בלולאה).

רוית

חזרה לתחילת העמוד הצג את כרטיס החבר של רוית חפש הודעות אחרות של רוית בקר בדף הבית של רוית
 
Fate
פורומיסט על
פורומיסט על
סמל אישי

הצטרף / הצטרפה: 25 October 2005
משתמש: מנותק/ת
הודעות: 571
נשלח בתאריך: 19 November 2005 בשעה 01:24 | IP רשוּם
ציטוט Fate

גלעד כתב:

יש לי בעיה, אני לא מצליח להדפיס את המספר 16 כשהוא מיוצג בבינארית ב 4^2.

כאשר אני מנסה להפריד בין שתי הספרות עם SHR ו AND אני מקבל שהסיפרה השמאלית היא 0 והימנית היא 1 מכיוון שיש לי רק ביט אחד דלוק במיקום החמישי (שתיים בחזקת ארבע).

למישהו יש רעיון?

 


בתכלס 16 דצימלי זה 10 בהקסדצימלי..

חזרה לתחילת העמוד הצג את כרטיס החבר של Fate חפש הודעות אחרות של Fate
 
Lib1
משתמש פעיל
משתמש פעיל
סמל אישי

הצטרף / הצטרפה: 03 May 2005
מדינה: Israel
משתמש: מנותק/ת
הודעות: 73
נשלח בתאריך: 21 November 2005 בשעה 02:36 | IP רשוּם
ציטוט Lib1

לרוית....
אני מקווה שאת יודעת אנגלית כי אם את רוצה באמת אבל באמת
ללמוד אסמבלי עם הרבה טריקים אז גשי לאתר:
http://webster.cs.ucr.edu/AoA/index.html
באתר הזה יש את הספר המקיף ביותר בעולם שנכתב על השפה הזאת!
והכל בחינם!

אבל בנתיים אפרסם כמה טריקים:

קוד:

Eax = integer.
   Add   Eax,Eax ; Multiply Eax by 2.
; Eax = 2*integer.

Or, multiplying Eax by 9 is as easy as:

; Eax = integer.
   Lea   Eax,[Eax+8*Eax] ; Multiply Eax by 9.
; Eax = 9*integer.


כמובן אפשר גם לשלב:
לדוגמא כדי להכפיל מספר ב-7 נניח שהמספר הוא ב - ax

קוד:

mov    bx,ax   ; bx =ax
shl    ax,2   ; ax = ax*8
sub    ax,bx   ; ax = ax*7
;because (ax*8)-ax = ax*7






====================
קוד:

; Edx = unsigned integer.
   Shr   Edx,2 ; Divide Edx by 4.
; Edx = Edx/4, rounded toward 0.

or, if Edx is a signed integer:

; Edx = signed integer.
   Sar   Edx,2 ; Divide Edx by 4.
; Edx = Edx/4, rounded toward minus infinity.


כדי לחשב שארית של משהו ניתן להשתמש בפקודה
AND

קוד:

65 mod 8:
65 and 7 ; 7=n-1 (n=8)

18 mod 4
18 And 3 ; 3 = n-1 (n=4)


הערה ה-n
יכול להיות רק בחזקות של 2



שארית
חזרה לתחילת העמוד הצג את כרטיס החבר של Lib1 חפש הודעות אחרות של Lib1
 

אם ברצונך להגיב לנושא זה עליך קודם להתחבר
אם אינך רשום/ה כבר עליך להרשם

  שליחת תגובהשליחת נושא חדש
גרסת הדפסה גרסת הדפסה

קפיצה לפורום
אינך יכול/ה לשלוח נושאים חדשים בפורום זה
אינך יכול/ה להגיב לנושאים בפורום זה
אינך יכול/ה למחוק את הודעותיך ותגוביך בפורום זה
אינך יכול/ה לערוך את הודעותיך ותגובותיך בפורום זה
אינך יכול/ה לצור סקרים בפורום זה
אינך יכול/ה להצביע בסקרים בפורום זה