نمایش یک تصویر گرافیکی در زبان اسمبلی

the_king

مدیرکل انجمن
کد زیر می تواند برای نمایش یک تصویر bitmap در مد گرافیکی 320 در 200 پیکسلی 256 سطع Grayscale
بکار رود، به شرط آنکه اطلاعات تصویر در متغیر BITMAP که یک رشته از بایت ها خواهد بود، قرار بگیرد :

کد:
.MODEL  SMALL
.CODE
.STARTUP
MOV     AX,13H
INT     10H
MOV     CX,255
L001:
PUSH    CX
MOV     AX,1010H
MOV     BX,CX
SHR     CL,1
SHR     CL,1
MOV     CH,CL
MOV     DH,CL
INT     10H
POP     CX
LOOP    L001
MOV     CX,320*200
MOV     AX,0A000H
MOV     ES,AX
MOV     BX,0
L002:
MOV     BX,CX
DEC     BX
MOV     AL,BITMAP[BX]
MOV     ES:[BX],AL
LOOP    L002
MOV     AH,8
INT     21H
MOV     AX,3
INT     10H
.EXIT
.DATA
BITMAP  DB	?
.STACK
END

the_king.gif


به عنوان مثال نمونه یک برنامه که تصویر آواتار حقیر را نمایش می دهد، ضمیمه این پست شده است.
 

پیوست ها

  • the_king.zip
    39.5 کیلوبایت · بازدیدها: 216

be_saho

New Member
سلام
خسته نباشید
می خواستم بدونم این کدی که نوشتین فقط برای عکس های grayscale کار میکنه؟؟
بعد اون برنامه ای که یه تصویر رو به کد تبدیل می کنه رو میشه یه جوری بنویسین که هر اندازه عکسی رو بگیره و به همون اندازه بر گردونه؟؟
من می خوام مهره ها و صفحه ی شطرنج رو ظاهر کنم.خب لازم هست که مهره خیلی کوچیکتر از صفحه باشه..
راستی میشه برا مد 640 *480 هم این کد رو نوشت؟؟ تعداد رنگ ها برام مهم نیست
از دوستان خواهش می کنم که کمک کنن..
ممنون
 

the_king

مدیرکل انجمن
سلام
خسته نباشید
می خواستم بدونم این کدی که نوشتین فقط برای عکس های grayscale کار میکنه؟؟
کد طوری طراحی شده که از جدول رنگ (Color Palette) ای استفاده کنه که فقط طیف سیاه تا سفید رو داره،
اما الزاما نه، می تواند با هر جدول رنگ دیگری هم کار کند، اما توجه داشته باشید که جدول رنگ اش 256 خانه بیشتر ندارد،
مثل تصاویر GIF که همزمان فقط 256 رنگ را نشان می دهند و برای تصاویری که خیلی رنگ هایشان متنوع است
مناسب نیست. این محدودیت تعداد رنگ مربوط به مود تصویر 320x200 کارت گرافیکی های VGA است.

بعد اون برنامه ای که یه تصویر رو به کد تبدیل می کنه رو میشه یه جوری بنویسین که هر اندازه عکسی رو بگیره و به همون اندازه بر گردونه؟؟
منظورتون این برنامه است؟ PicToAsm.zip ، بله امکانش هست، یک گزینه Fit to 320x200 اضافه کردم که می توانید
غیر فعالش کنید، اما به هر حال هم خروجی Grayscale است و هم موقع نمایش اش باید از کد خاصی استفاده کنید
که از طول و عرض داده اطلاع داشته باشد. PicToAsm2.zip

من می خوام مهره ها و صفحه ی شطرنج رو ظاهر کنم.خب لازم هست که مهره خیلی کوچیکتر از صفحه باشه..
راستی میشه برا مد 640 *480 هم این کد رو نوشت؟؟ تعداد رنگ ها برام مهم نیست
از دوستان خواهش می کنم که کمک کنن..
ممنون

باید از مود تصویری 12h استفاده کنید که 640x480 از نوع 16 رنگی است :
کد:
MOV     AX,12H
INT     10H

برای نمایش پیکسل ها هم دیگه دسترسی مستقیم به حافظه چندان ساده نیست، بهتره که از وقفه ها
استفاده کنید که البته کنده، چون باید برای درج کردن هر پیکسل یکبار وقفه رو فراخوانی کنید.

کد کامل پروژه در مود 640x480 به همراه فایل اجرایی exe ضمیمه این پست می باشد.
 

پیوست ها

  • PicToAsm2.zip
    32.8 کیلوبایت · بازدیدها: 118
  • pic.zip
    39.7 کیلوبایت · بازدیدها: 87

be_saho

New Member
ممنونم از لطفتون..میشه بگید اون برنامه pic2asm به چه زبانی نوشته شده و طرز کارش چیه؟؟
چه جوری می تونم یه عکس رو که اینجوری ظاهر کردم تو یه موقعیت خاص از صفحه ظاهر شه؟؟مثلا دقیقا تو یه خونه ی مشخص از صفحه ی شطرنجی که ظاهر شده..
 
آخرین ویرایش:

the_king

مدیرکل انجمن
ممنونم از لطفتون..میشه بگید اون برنامه pic2asm به چه زبانی نوشته شده و طرز کارش چیه؟؟

با ویژوال بیسیک نوشتمش، کار خاصی نمی کنه، یک تصویر رو از اولین نقطه بالا سمت چپ (مختصات [0,0] ) تا
آخرین نقطه پایین سمت راست دونه دونه بررسی می کنه، رنگ هر نقطه رو بصورت Grayscale یک بایتی
محاسبه می کنه (عددی بین 0 - مشکی الی 255 - سفید) و در یک فایل متنی می نویسه.

چه جوری می تونم یه عکس رو که اینجوری ظاهر کردم تو یه موقعیت خاص از صفحه ظاهر شه؟؟مثلا دقیقا تو یه خونه ی مشخص از صفحه ی شطرنجی که ظاهر شده..
در کد اسمبلی دوم من همینکار رو کردم :
کد:
    ADD     CX, 160
    ADD     DX, 140
یعنی تصویر در مختصات 160,140 نمایش داده بشه. CX برای محور x است و DX برای محور y
به همین دلیل است که اون آواتار وسط صفحه قرار گرفته، وگرنه اگر این دو سطر کد را حذف کنید، گوشه صفحه
نمایش داده میشه یعنی مختصات 0,0
 

be_saho

New Member
بازم عذر می خوام..این برنامه ای که نوشتین رو من برای عکس های کوچکتر از 320 و بزرگتر از 320 تست کردم..برا کوچکتر از 320 فایل exe دررست میشه تو masm ولی عکس مورد نظر درست نمایش داده نمیشه یعنی نصفش همون عکسست نصف بقیش هم برفکی..
برای عکس های بزرگتر از 320 هم اصلا فایل exe تولید نمیشه..اگه ممکنه یه بار دیگه برنامه رو چک کنین..
میشه برای pic2 asm سورس کدش رو بذارین، لطفا..
ممنون
 

the_king

مدیرکل انجمن
بازم عذر می خوام..این برنامه ای که نوشتین رو من برای عکس های کوچکتر از 320 و بزرگتر از 320 تست کردم..برا کوچکتر از 320 فایل exe دررست میشه تو masm ولی عکس مورد نظر درست نمایش داده نمیشه یعنی نصفش همون عکسست نصف بقیش هم برفکی..
برای عکس های بزرگتر از 320 هم اصلا فایل exe تولید نمیشه..اگه ممکنه یه بار دیگه برنامه رو چک کنین..
میشه برای pic2 asm سورس کدش رو بذارین، لطفا..
ممنون

دو نکته وجود داره، اول اینکه برنامه اسمبلی خودش هیچ اطلاعاتی در مورد ابعاد تصویری که شما قصد
نمایش اش رو دارید نداره، شما باید خودتون شرط پایان نمایش تصویر رو با ابعاد تصویر تون هماهنگ کنید، وگرنه
یکسری داده خارج از محدوده که معلوم نیست توشون چی قرار داره رو هم قاطی تصویر می کنید که بصورت نویز
نمایش داده میشه. منظورم این دو شرطه :
کد:
    CMP     CX, 320

کد:
    CMP     DX, 200

نکته دوم هم اینه که برای نمایش تصاویر از یک اشاره گر 16 بیتی SI استفاده شده که محدوده اش یک عدد بین
0 الی 65535 است، یعنی فوقش 65536 پیکسل رو نشون میده :
کد:
    MOV     AL, [SI]
حالا اگه شما تصویری رو بخواهید با این کد نشون بدید که تعداد پیکسل هاش از این بیشتره، SI سرریزی می کنه
و دوباره بر می گرده سر اولین پیکسل تصویر.

آخه ظرفیت اون سگمنت بیچاره DATA رو هم در نظر بگیرید، هر سگمنت 64 کیلوبایت بیشتر نیست، یعنی 65536 بایت.
اگه بخواهید داده بیشتر از این رو در برنامه ذخیره کنید هم باید توی کد نمایش داده یکسری تغییرات بدهید و
هم مدل حافظه رو از SMALL به یک مدل حافظه دیگه مثل LARGE تغییر بدهید :

کد:
.MODEL  LARGE

کد کامل برنامه Pic To Asm رو ضمیمه این پست کردم.
 

پیوست ها

  • Pic To Asm.zip
    57.6 کیلوبایت · بازدیدها: 56

marjanbagheri

New Member
سلام ممنون از کد که نوشتید
میشه توضیحی در مورد این که چه طور طلاعات تصویر در متغیر bitmap که یک رشته از بایت ها خواهد بود، را ذخیره کنم
 

the_king

مدیرکل انجمن
سلام ممنون از کد که نوشتید
میشه توضیحی در مورد این که چه طور طلاعات تصویر در متغیر bitmap که یک رشته از بایت ها خواهد بود، را ذخیره کنم

رجوع کنید به همان پست قبلی ام، فایل Pic To Asm.zip مربوط به برنامه ای است که یک تصویر رو به رشته ای از بایت ها تبدیل می کنه.
اون رشته رو در کد برنامه اسمبلی جایگزین کنید.
 

marjanbagheri

New Member
رجوع کنید به همان پست قبلی ام، فایل Pic To Asm.zip مربوط به برنامه ای است که یک تصویر رو به رشته ای از بایت ها تبدیل می کنه.
اون رشته رو در کد برنامه اسمبلی جایگزین کنید.
ممنونم از راهنماییتون ولی هنوز نتونستم از کد سر در بیارم و تحویل پروژه رسیده :cry:
نمیشه یکم بیشتر توضیح بدین
 

fateme1370

New Member
سلام . من برنامه را دانلود کردم که نوشته بودید . ولی متاسفانه اجرا نمیشه . ارور وین 32 میده . من لپتاپم 64 بیتیه . یعنی راهی نداره؟
 

the_king

مدیرکل انجمن
سلام . من برنامه را دانلود کردم که نوشته بودید . ولی متاسفانه اجرا نمیشه . ارور وین 32 میده . من لپتاپم 64 بیتیه . یعنی راهی نداره؟

کلیه برنامه های 16 بیتی که برای اجرا در DOS یا ویندوز های قدیمی طراحی شده بودند در ویندوز های 64 بصورت مستقیم قابل اجرا نیستند. دلیلش اینه که ویندوز های 64 بیتی فقط برنامه های 32/64 بیتی رو اجرا می کنند.
برای اجرا کردن برنامه های قدیمی 16 بیتی مثل ++Turbo C و Turbo Pascal و MASM و TASM و ... یکی از این دو روش توصیه میشه :

1) یک ویندوز 32 بیتی مثل Windows XP را با یک ماشین مجازی مثل Windows Virtual PC و قابلیت Windows XP Mode و یا نرم افزار های ماشین مجازی مستقلی مثل Oracle VM VirtualBox نصب کنید.
در این ویندوز مجازی می توانید تحت همان ویندوز 64 بیتی هر برنامه 16 بیتی را اجرا کنید (اجرای یک ویندوز مجازی در محیط یک ویندوز واقعی)

2) ابزار DosBox را نصب کنید. این ابزار می تواند یک محیط Command Prompt کاملا سازگار با برنامه ها و بازی های قدیمی MS-Dos ایجاد کند.
ابتدا برنامه ای که قراره در DOS اجرا بشه را در پوشه ای نظیر D:\app کپی کنید. فرضا اکنون D:\app\the_king.exe مسیر فایل اجرایی مورد نظر است.
بعد از اجرا کردن DosBox دستورات زیر را برای اجرا کردن اون فایل D:\app\the_king.exe بنویسید :

کد:
mount X D:\app
X:
CD app
the_king.exe

DOSBox, an x86 emulator with DOS

DOSBox 0.74 for Windows
 

جدیدترین ارسال ها

بالا