PDA

View Full Version : مشکل در استفاده inline کد اسمبلی در C++



vbkaar
شنبه 16 دی 1391, 22:08 عصر
من میخواستم کد اسمبلی رو در C اجرا کنم و از این کد استفاده کردم:


#include<stdio.h>
void main()
{
int a;
asm {
mov a,3
}
printf("%d",a);
}


ولی از هر دستوری استفاده میکنم نمیتونم دستورات ورودی خروجی رو به زبان اسمبلی بنویسم. میخواستم ببینم چطور میشه به این شکل , به زبان اسمبلی میشه یک رشته رو در خروجی نوشت یا یک عدد رو دریافت کرد. خواهش میکنم راهنمایی کنید.

#target
شنبه 16 دی 1391, 22:38 عصر
معمولا دیگه از اون IN , OUT در چنین برنامه ای که Usermode هست استفاده نمیشه (برا برنامه داس هست اون) . شما میتونین توابع رو با اسمبلی فراخوانی کنین)

vbkaar
شنبه 16 دی 1391, 22:39 عصر
معمولا دیگه از اون IN , OUT در چنین برنامه ای که Usermode هست استفاده نمیشه (برا برنامه داس هست اون) . شما میتونین توابع رو با اسمبلی فراخوانی کنین)

میشه لطفا با مثال توضیح بدید؟

#target
شنبه 16 دی 1391, 22:45 عصر
#include<stdio.h>
void main()
{
int a;
char* x = "%d";
asm {
mov a,3
push a
push &x
call &printf
}
}

vbkaar
دوشنبه 18 دی 1391, 10:39 صبح
دوستان یک سوال دیگه دارم. ببخشید که همینجا مطرح میکنم .دوستان ظاهرا وقتی برنامه بر روی win32 اجرا میشه , امکان استفاده از وقفه ها در کد inline وجود نداره . می خواستم ببینم راهی نیست که مثلا برنامه رو جوری تغییر داد که به Dos 16 تغییر کنه . یا به هر شکلی بشه وقفه ها رو در اسمبلی inline اجرا کنیم؟ خواهش میکنم کمک کنید.

#target
دوشنبه 18 دی 1391, 11:48 صبح
از Emulator میشه استفاده کنی برای اجرا اون برنامه ها . یا ماشین مجازی !

تو اون مثالم بعد از فراخوانی باید پشته رو پاکسازی کنی چون تابع cdecl__ هست من یادم رفت بذارم

vbkaar
دوشنبه 18 دی 1391, 15:37 عصر
از Emulator میشه استفاده کنی برای اجرا اون برنامه ها . یا ماشین مجازی !

تو اون مثالم بعد از فراخوانی باید پشته رو پاکسازی کنی چون تابع cdecl__ هست من یادم رفت بذارم

دوست عزیز واقعا ممنونم از راهنمایی های شما. بالاخره تونستم با استفاده از کامپایلر turbo c وقفه ها رو اجرا کنم.

vbkaar
دوشنبه 18 دی 1391, 17:54 عصر
یک سوال برام پیش اومده. من تونستم با استفاده از وقفه (int 21) یک رشته رو در خروجی چاپ کنم.
حالا چطور میتونم با استفاده از وقفه ها یک عدد رو از ورودی بگیرم. از هر کدی استفاده میکنم مشکل داره. لطفا راهنمایی کنید.

the king
دوشنبه 18 دی 1391, 22:06 عصر
یک سوال برام پیش اومده. من تونستم با استفاده از وقفه (int 21) یک رشته رو در خروجی چاپ کنم.
حالا چطور میتونم با استفاده از وقفه ها یک عدد رو از ورودی بگیرم. از هر کدی استفاده میکنم مشکل داره. لطفا راهنمایی کنید.

مستقیما نمیشه عدد گرفت، یعنی نه BIOS و نه DOS هیچکدوم برای اینکار سرویس آماده ای ندارند.
بجایش یک رشته از ورودی می خوانید (سرویس 0A در وقفه 21h) و خودتان روتینی می نویسید که رشته را پردازش کند تا به معادل عددی اش تبدیل شود.

مثلا اینجوری در BX یا numDec عدد چند رقمی رو آماده استفاده می کنیم :


.MODEL SMALL
.DATA
msg1 DB "Please enter a number : $"
numMax DB 5
numLen DB ?
num DB 5 DUP (?)
numDec DW ?
.CODE
.STARTUP
MOV AH, 09h
LEA DX, msg1
INT 21h
MOV AH, 0Ah
LEA DX, numMax
INT 21h
MOV CL, numLen
MOV CH, 0
LEA SI, num
MOV BX, 0
loop1:
MOV AX, 10
MUL BX
MOV BL, [SI]
INC SI
SUB BL, '0'
MOV BH, 0
ADD BX, AX
LOOP loop1
MOV numDec, BX