פתרונות לשעורי בית

Begel

New member
תרגיל קטן באסמבלר

היי, אני מלא זמן מסתבך בתרגיל הזה. אני אשמח אם מישהו יוכל לעזור:
יש להציב מספר במשתנה NUM1 בגודל בית. יש לכתוב תוכנית המציבה במשתנה NUM2 בגודל זהה את השיקוף הבינארי של המספר בNUM1.
לדוגמא: NUM1=0011 1110 אז NUM2=0111 1100

NUM2 הוא למעשה "ההשתקפות" של NUM1.
0011 1110:0111 1100
 

Begel

New member
הפתרון שלי (אני אשמח אם מישהו יוכל לתקן)

DATA SEGMENT
NUM1 DB 5B
NUM2 DB 0
DATA ENDS

CODE SEGMENT
ASSUME CS:CODE, DS:DATA
START: MOV AX, DATA
MOV DS, AX
MOV CX, 8
AGAIN: RCR NUM1, 1
ADC NUM2, 0
LOOP AGAIN
CODE ENDS
END START

תודה.
 

Begel

New member
הסבר נוסף

קודם כל אם התרגיל לא ברור / יש פקודה לא ברורה בבקשה תכתבו ואני אסביר שוב. כי עד עכשיו אף אחד לא הגיב..
כרגע מה שהפתרון שלי עושה הוא סופר את כמות הסיביות הדלוקות בNUM1.
במקום שזה יעשה 0+1+1.. אני רוצה שהוא פשוט ישים את המספרים ,0 ו1, לדוגמא אם המספר הוא 0111-1100,
אז שבאיטרציה הראשונה ישים בNUM2 אפס
באיטרציה השניה NUM2=00
בשלישית: 001
ברביעית 0011
ועכשיו מה שזה עושה זה פשוט חיבור נניח 0+1 ומציב את התוצאה בNUM2.
כדי לפתור את זה חשבתי להשתמש במערך ובכל תא בו להציב 0 או 1, הבעיה היא שאחר כך אני לא יודע איך לייצג את כל המערך כמספר.
ז"א נניח המערך הוא 0111-1100 כשבתא 0 יש 0, בתא 1 יש 1, בתא 2 יש 1 וכך הלאה, איך לקחת את כל המערך כמספר ולהציב בNUM2.

תודה..
 

טרמפיסט

New member
בסה"כ התשובה נכונה

עושה רושם שאתה בכיוון הנכון: אתה "מסובב" את המספר המקורי ימינה דרך ה-Carry ומוסיף את הביט הזה למספר ה-"מראה".
שים לב שהביט המתווסף בכל איטרציה ל-num2 תמיד מתווסף במקום הימני ביותר לכן חשוב לדחוף את הערך שמאלה במקום אחד בכדי לפנות מקום לביט באיטרציה הבאה.
באופן הזה בסופו של התהליך הביטים "יתמלאו" ב-num2 כך שהביט הראשון שדחפת יופיע בצד השמאלי ביותר והביט שהוספת אחרון ישאר הימני ביותר.
התשובה שלי לא רחוקה משלך (השמטתי את הפתיח והסיום):

next_bit: rcr num1, 1
shl num2, 1
adc num2, 0
loop next_bit
 
למעלה