PDA

View Full Version : برخورد با ارور هنگام استفاده از int86



program33r
دوشنبه 05 دی 1390, 09:52 صبح
سلام دوستان
بنده سعي ميكنم با استفاده از int86 با وقفه ها كار كنم .

اما در ارور Microsoft Visual Studio 2010 ميده :

e:\cpp_starter_package\xz\xy\xy\xy.cpp(25): error C3861: 'int86': identifier not found



#include <iostream>
#include <dos.h>
#include <Windows.h>
#include <stdio.h>
#include <conio.h>
#include <math.h>
#include <string.h>




int main()
{

int86();

system("pause");
}

shahmohammadi
دوشنبه 05 دی 1390, 11:12 صبح
سلام.
فایل های اجرایی ای که این کامپایلر تولید می کنه، فایل های اجرایی ویندوز هست. حتی فایل های کونسولش (صفحه سیاه با متن سفید) هم همین طور.
وقفه ها در فایل های اجرایی داس کاربرد دارند. برای کار با وقفه ها باید از کامپایلری مثل Turbo C++ استفاده کنید.

program33r
دوشنبه 05 دی 1390, 23:32 عصر
اگه ميتوني يه نمونه از كد از Turbo C++‎ بزار و بگو include هاشو از كجا دانلود كنم ؟
مرسي

shahmohammadi
سه شنبه 06 دی 1390, 09:42 صبح
همون طوری که در کتاب جعفرنژاد قمی نوشته می تونید توی این کامپایلر بنویسید:
#include <stdio.h>
#include <conio.h>
#include <dos.h>

#define VIDEO 0x10

void movetoxy(int x, int y)
{
union REGS regs;

regs.h.ah = 2; /* مکان نما رو تنظیم می کنه */
regs.h.dh = y;
regs.h.dl = x;
regs.h.bh = 0; /* صفحه 0 از حافظه ویدیو */
int86(VIDEO, &regs, &regs);
}

int main(void)
{
clrscr();
movetoxy(35, 10);
printf("Hello\n");
getch();
return 0;
}
به غیر از این می تونید از دستورات اسمبلی مربوط به فرا خوانی وقفه ها هم استفاده کنید:
#include <stdio.h>
#include <conio.h>

void SetCur(unsigned size)
{
asm mov ah,1
asm mov cx,size
asm push bp
asm int 10h
asm pop bp
}
int main(void)
{
int s=1;
clrscr();
while(s!=0)
{
printf("Enter the Cursor size: (0 for end) ");
scanf("%d",&s);
SetCur((unsigned)s);
}
getch();
return 0;
}
با دانلود اینکلود هاشم نمی تونید تو کامپایلر ویژوال سی پلاس ازش استفاده کنید چون فایل کنسولی که کامپایلر شما تولید می کنه، از نوع فایل ویندوز هست و فایل های ویندوز نمی تونند از وقفه ها استفاده کنند.
اگه می خواهید به وقفه ها کار کنید باید کامپایلری داشته باشید که فایل اجرایی از نوع داس تولید کنه. که یکی از اینها کامپایلری هست که من گفتم.

program33r
پنج شنبه 08 دی 1390, 17:19 عصر
دوست عزيز ممنون از كمكت
حالا يه برنامه نوشتم خودتون توجه كنيد :

الان كد بدون ارور كار ميكنه, اما كرسر ماوس كجاست ؟
با تابع getXY مكان كرسر ماوس رو ميخوام چاپ كنم اما هميشه -12 و -14 خروجي ميده !


#include <stdio.h>
#include <conio.h>
#include <dos.h>


void setXY(int x,int y);
void showm();

void getXY(int *x,int *y);
int main()
{
showm();
int *x,*y;
getXY(x,y);
printf("%d %d",&x,&y);
getch();
return 0;
}

void getXY(int *x, int *y)
{
REGS in,out;
in.x.ax = 0x03;
int86(0x33,&in,&out);
*x = out.x.dx;
*y = out.x.cx;
}

void setXY(int x,int y)
{
REGS in,out;
in.x.ax = 0x04;
in.x.cx = y;
in.x.dx = x;
int86(0x33,&in,&out);


}

void showm()
{
REGS in,out;
in.x.ax = 0x01;
int86(0x33,&in,&out);
}

r00tkit
پنج شنبه 08 دی 1390, 17:49 عصر
برای این کار ها از توابع معادل ویندوزش استفاده کن توی همین سایت کلی مطلب در مورد هستش
SetConsoleCursorPosition
تابع بالا رو سرچ کن
درمورد اینتراپت ها هم توی حالت protected mode از cpu ( مثلا حاتی که همین ویندوز توش داره کار می کنه ) ّبعضی از دستور عمل ها رو نمی تونی توی user-mode استفاده کنی