ورود

View Full Version : چرا عدد چاپ نمیشه؟



one hacker alone
دوشنبه 07 آذر 1390, 13:57 عصر
با یاد خدا
با سلام خدمت دوستان عزیز
یک سوال ساده در مورد چاپ عدد داشتم
تاجایی که یادمه ما برای چاپ رشته اون رو در ایپبتدای برنامه داخل یک متغییر مینوشتیم بعد در ثبات dx سپس سرویس 09 و در پایان int رو فراخوانی میکردیم
یعنی:


lea dx,str
mov ah,09h
int 21h

حالا اگه من بخوام عددی را در در یک متغییر بریزم و اون رو چاپ کنم چکار کنم؟
برای من عدد رو کد اسکی حساب میکنه و اشکال دیگه رو چاپ میکنه

xman_1365_x
دوشنبه 07 آذر 1390, 15:51 عصر
اگر در دیتا سگمنت رشته ای از کاراکتر رو تعریف کنید مثل زیر مشکلی نیست

str db "your string 123$"
اگر به صورت زیر باشه باید روالی برای تبدیل عدد به کد اسکی بنویسید قبلا جواب داده شده بهتر بود جستجو میکردین

str db 123 , '$'

در حالت کلی:
1-ورودی-خروجی
اگر بخواین از ورودی عدد بگیرین مثل کیبورد یا بخواین خروجی رو نمایش بدین مثلا روی نمایشگر و چاپگر
ورودی که داده ها به صورت اسکی فرستاده میشه ، و در خروجی هم شما باید در صورتی که داده ها به صورت
کد اسکی نمیباشد آنها را تبدیل کنید تا قابلیت نمایش به صورت خوانا داشته باشه.
همونطور که میدونید در کد اسکی اعداد از 48 تا 57 ده دهی کد شده
با چند روش میشه این کار رو انجام داد جمع نمودن رقم! با 30 هگز یا 48 ده دهی یا or که سریع تر هست.
اگر عدد شما بیش از یک رقم باشه باید با تقسیم متوالی رقم ها رو جدا کرده و هر کدام رو جدا گانه تبدیل کنیم

2-پردازش
اگر شما بخواین محاسبه ای انجام بدین که سریع باشه نیاز به تبدیل اسکی به باینری دارین (توجه:ما میتونیم روی همون داده های اسکی هم محاسبه انجام بدیم اما کندتر و حافظه زیادی اشغال میکنه)
و بر ای تبدیل اسکی به باینری با کم کردن کاراکتر از 30 هگز یا 48 ده دهی و یا and نمودن که روشی سریعتر هست تبدیل را انجام بدیم.

فکر کنم توضیح کافی باشه
موفق باشی

hepL3r
سه شنبه 08 آذر 1390, 09:28 صبح
برای چاپ یه عدد که توی یه متغیر هست میتونید از API استفاده کنید :
mov eax,3
invoke wsprintf,addr N2C,addr Format,eax

محتویات eax به صورت string توی N2C قرار میگیره .
فرمت رو هم میتونید به صورت زیر تعریف کنید :
.data
Format db "%X",0

one hacker alone
سه شنبه 08 آذر 1390, 09:41 صبح
ممنون از راهنماییتون حالا سوالی که برام پیش اومد اینه که اگه من بنویسم mov ax,65 برنامه اکون عدد رو به عنوان چی در نظر میگیره یعنی میخوام بدونم اعداد در حالت عادی در اسمبلی چه مفهومی دارند؟ HEX هستند؟


ایا توابع api که ما در اسمبلی استفاده می کنیم همان توابع api هستند که در زبان هایی مثل VB استفاده می کنیم؟

xman_1365_x
سه شنبه 08 آذر 1390, 17:58 عصر
ممنون از راهنماییتون حالا سوالی که برام پیش اومد اینه که اگه من بنویسم mov ax,65 برنامه اکون عدد رو به عنوان چی در نظر میگیره یعنی میخوام بدونم اعداد در حالت عادی در اسمبلی چه مفهومی دارند؟ HEX هستند؟
همه داده ها به صورت باینری هستند و از هگز فقط برای نمایش خلاصه استفاده میکنیم و محاسباتی که برای ما انسان ها راحت تر هست
و اینکه ما فقط از داده های باینری ساختار خاصی میسازیم که برامون معنی و مفهموم متفاوتی داره، و وقتی شما 65 در مبنای دسیمال رو به خروجی ببرید کاراکتر A نمایش داده میشه و هنگامی که شما در ادیتور مینویسید A با 65 فرقی نداره ، هنگام لینک شدن مقدار عددی آن در حافظه قرار میگیره
دلیلش هم اینه دستگاه های خروجی مثل مانیتور اینطور برنامه ریزی شده که این کد کردن رو میشناسه و میتونه بعد از دریافت کاراکتر شما رو نمایش بده

کد اسکی از از 7 بیت ساخته شده که میشه باهاش 128 حالت مختلف داشت و اومدن به هر عدد کراکتری رو نسبت دادن تا بشه با کیبورد حروف و عدد و دکمه های مختلف رو به رایانه داد برای پردازش و استاندارد شد تا همه رایانه ها از یک کد استفاده کنند تا برنامه ها در همه رایانه ها قابل اجرا باشه و ...
و همونطور که میدونید واحد های حافظه به بایت تقسیم میشه پس کد اسکی در واقعیت 8 بیت رو اشغال میکرد و بعدا هم کد اسکی توسعه یافته اومد از باقی این بیت ها استفاده کرد و برای هرکدوم کاراکتر خاصی در نظر گرفت که بعد ها دیدین برای همه زبان ها جوابگو نیست و اومدن از یونی کد هم استفاده کردن که هر کاراکتر دو بایت اشغال میکنه و دیگر استاندارد ها هم به همین شکل هست که هدف خاصی رو دنبال میکنه
و اینکه اینکار که کاراکتری رو به عددی نسبت بدن تصادفی نیست و حساب شده هست مثال:
کاراکتر a , A
A=01000001=65
a=01100001=97
همونطور که میبینید در حافظه به صورت باینری ذخیره میشن و در یک بیت اختلاف دارن و از همین میشه برای تبدیل استفاده کرد و حفظ اعداد هم ساده تر میشه


ایا توابع api که ما در اسمبلی استفاده می کنیم همان توابع api هستند که در زبان هایی مثل VB استفاده می کنیم؟

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

hepL3r
چهارشنبه 09 آذر 1390, 13:51 عصر
البته اگه منظورتون توابع کتابخانه ای VB باشه , بله فرق دارن :
به عنوان مثال VB برای تست دو متغیر از این api استفاده میکنه : vbaVarTstEq که البته این api خودش میره یه api استاندارد دیگه رو فراخوانی میکنه .
ولی اگه منظورتون فراخوانی api هایی مثل GetModuleHandleA هست , در کل فرقی نمیکنه .