עבור לתוכן

מסגרת לטקסט באסמבלי

Featured Replies

פורסם

שלום.

איך אני עושה מסגרת כמו בתמונה המצורפת?

הגעתי עד המצב שזה מקרין את השם שלי במרכז המסך (ממש בעיה ;) ) , איך אני מוסיף לזה מסגרת?

[attachment deleted by admin]

פורסם

שים לב שהמסגרת בעצם עשויה מתווים.

תגלה את התווים שיוצרים גבולות לטבלאות ותדפיס גם אותם, כמו כל מחרוזת אחרת.

פורסם
  • מחבר

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

זה לא בעיה.

יש לי רעיון לאלגוריתם אבל לפני שאשבור את הראש איך ליישם אותו (תוכנית ראשונה שלי באסמבלי) אשמח לשמוע אם הוא יעיל מספיק:

1. לבדוק את אורך המחרוזת

2. להקרין שורה של החלק העליון של המסגרת עד len ואז לרדת שורה

ואת ההמשך כבר הבנתם.

השאלה איך אני אני עובד עם ההיסטים, איך אני משחק עם היסט של הסמן?

פורסם

אתה יודע בדיוק מה רוחב המסך שלך, אז תעשה עוד חישוב לפני זה.

כך שתתחיל לכתוב במיקום

(screen_length / 2) - (string_length / 2) - 1

התו הנוסף הוא עבור התו של המסגרת.

פורסם
  • מחבר

אכן אני יודע אבל שאלתי היא איך אני מזיז את הסמן (לא את גודל ההזזה).

יש איזה אוגר היסט או משהו כזה?

פורסם

אני לא מבין. איך הצלחת להדפיס טקסט באמצע המסך, ולמה אתה לא יכול להשתמש באותה שיטה להדפיס את המסגרת?

פורסם
  • מחבר

כי עשיתי זאת בשיטה שלא נראת לי הכי סימפטית.

במקטע הנתונים הגדרתי X בתים לא מאותחלים ואז את הטקסט הקרנתי החל מהoffset שלהם (ובמקרה זה יצא במרכז המסך).

אין פה שום אוטומציה וגם לא נראה לי שאני יכול לגעת במקטע הנתונים בזמן ריצה.

 data segment
middle db 994 dup()
msg db 'Bla Bla$'

data ends
sseg segment stack 'stack'
db 200h dup(?)
sseg ends
code segment
assume cs:code,ds:data
start: mov ax,data
mov ds,ax

mov ah,9
mov dx,offset middle

int 21h
mov ah,4ch
int 21h
code ends
end start

פורסם

הייתי ממליץ לך לבדוק איך הדפסת טקסט למסך באמת עובדת ולא לנסות לנחש.

ככה תבין יותר טוב למה מה שאתה מדפיס נמצא איפה שאתה מדפיס אותו ואיך תוכל לשלוט במה שאתה מדפיס.

האמת שאני לא מכיר את האסמבלר הזה אבל שמתי לב שאתה קורא ל-ds בשם data ואז נראה כי שתי השורות הראשונות מיותרות.

כמו כן כדאי לוודא ביציאה שהאוגר ax מכיל 4c00h ולא סתם מספר ב-al שמכיל את קוד היציאה, סתם בשביל כתיבה נכונה.

בקשר להדפסה, יש לך (ככה זה בדוס בכללי) 25 שורות ו-80 עמודות במסך, שהרי הטקסט בדוס הוא ברוחב אחיד לכל תו,

ואתה רוצה להדפיס במיקום ספציפי, אתה מקבל כך את המיקום בו יש להתחיל את ההדפסה

offset = ((row) * 80) + col - (string_length / 2)

פורסם
  • מחבר

יש איזה דרך לחשב אורך של מחרוזת (חוץ מחיסור היסטים)?

כי הרי length str תחזיר 1 ולא את אורך של str

פורסם

בוודאי, אתה יכול להגדיר איזשהו בית אחרי המחרוזת ולחסר את ההיסט שלו מההיסט של תחילת המחרוזת.

אפשר גם לבנות פונקציה שסוכמת את מספר הבתים מהיסט מתקבל עד לבית המכיל '$' ולהחזיר את מספר הבתים שעברו.

פורסם
  • מחבר

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

אני מנחש שזה בגלל הדולר או בגלל שפונקציה 9 פשוט מוסיפה רווח.

איך נפטרים מהרווח הזה?

נא לרחם בהערות - זאת הפעם הראשונה שאני נוגע באסמבלי.

 data segment

msg db 'Yakobi Oren$'

strlen EQU $ - msg - 1


CRLF db ,13,10,"$"

SPACE db ,20h,"$"

border1 db ,45,"$"

border2 db ,179,"$"

var dw 1 dup()

data ends


sseg segment stack 'stack'
db 200h dup(?)
sseg ends
code segment
assume cs:code,ds:data
start: mov ax,data
mov ds,ax

mov var,strlen

mov cx,10
mov ah,9

call middle

mov cx,14

call spaces

rectangle:

mov cx,var

call upper

mov dx,offset CRLF
int 21h

mov cx,14
call spaces

mov dx,offset border2
int 21h
mov dx,offset msg
int 21h
mov dx,offset border2
int 21h
mov dx,offset CRLF
int 21h
mov cx,14
call spaces
mov cx,var
call upper

mov ah,4ch
int 21h

;----------procedures----------

spaces:

mov dx,offset SPACE
int 21h


dec cx
cmp cx,0
JG spaces
ret

;----

middle:

mov dx,offset CRLF
int 21h


dec cx
cmp cx,0
JG middle
ret

;----

upper:

mov dx,offset border1
int 21h
dec cx
cmp cx,0
JG upper
ret

;----

code ends
end start

[attachment deleted by admin]

פורסם
  • מחבר

מצאתי את הבעיה

הפסיק שמימין של db מיותר.

אשמח להצעות יעול הקוד (הוא תקין).

יש לי עד מחר אחר הצהריים.

תודה בכל אופן בנתיים.

ארכיון

דיון זה הועבר לארכיון ולא ניתן להוסיף בו תגובות חדשות.

דיונים חדשים