Форум программистов, компьютерный форум CyberForum.ru

Как правильно вставить код на ассемблере? - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Ошибка при компиляции http://www.cyberforum.ru/cpp-beginners/thread646098.html
При компиляции конструктора класса, имеющего один из аргументов другого класса получаю ошибку. Ниже листинг программы и код ошибки. // Date 9.7.1.h #include"Month.h" class Year { class Invalid { }; // for exception handing
C++ Пять самых длинных слов Дана строка слов разделенных пробелами, запятыми, точками. Сформируйте новую строчку из пяти самых длинных слов. #include <iostream> #include <string.h> using namespace std; void main(){ const int max=100; char str,words; http://www.cyberforum.ru/cpp-beginners/thread646068.html
C++ this и конструктор
Всем привет! Столкнулся с задачей: У класса есть статический указатель, который инициализируется CableTV* CableTV :: ptr = new CableTV; Есть также два указателя в привате PaketAndChannels * paketandchannel; Clients *client;
C++ Что считывает антивирусный сканнер с файлов?
Привет! Скажите пожалуйста, что считывает антивирусный сканер? Как эти шестнадцатеричные числа называются у файлов? И как узнать у файлов в C++ эту сумму? Если не в курсе как ее получить, то просто название скажите) Заранее спасибо.
C++ Описать функцию, которая формирует текстовую строку http://www.cyberforum.ru/cpp-beginners/thread645961.html
Дан текст в файле F1 в виде: ИМЯ ОТЧЕСТВО ФАМИЛИЯ_1 ИМЯ ОТЧЕСТВО ФАМИЛИЯ_2 ... Описать функцию, которая формирует текстовую строку в формате: ФАМИЛИЯ И.О. Сохранить преобразованный текст в файле F2.
C++ Определение перечисления (enum) в другом файле Доброго времени суток! :) Вот мой вопрос: в классе A мне необходимо использовать перечисление B, но объявление и определение класса находятся в разных файлах. Можно ли сначала объявить перечисление, а определить в другом файле и, если можно, как это сделать? // file a.h // Объявление класса сlass A { public: A() { } enum B { }; подробнее

Показать сообщение отдельно
alsav22
5413 / 4809 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
03.09.2012, 19:20  [ТС]     Как правильно вставить код на ассемблере?
Цитата Сообщение от Kastaneda Посмотреть сообщение
Код сам писал?
Нет. Вопрос на форуме ошибка при компиляции программы Код в инете выложен http://vmg.pp.ua/books/КопьютерыИсет...W/VIEWROOT.CPP Только я его немного подправил (чтобы ошибок компилятор не выдавал). У меня сейчас так компилируется (в студии) без ошибок:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
struct
{
  unsigned long first_sect;
  unsigned nsect;
  void *buf;
} cb;
 
/**
* getboot
*
* Прочитать загрузочную запись
*
* int getboot(BOOT *boot, int drive);
*
*  boot   - указатель на буфер, в который
*           будет прочитана загрузочная запись
*
*  drive  - номер физического НМД
*           (0 - первый НМД, 1 - второй, ...)
**/
 
int getboot(BOOT *boot, unsigned char drive)
{
  cb.first_sect = 0;
  cb.nsect = 1;
  cb.buf = (void*)boot;
  __asm
{
    mov AH, 25H
    LDS BX, cb.buf
    mov CX,  1
    mov DX,  0
    mov AL,  drive
}
  __asm int 25h
 
  // Извлекаем из стека оставшееся там после
  // вызова прерывания слово
  __asm pop ax
  __asm jc err
  
  return 0;
err:
  return 1;
}
Но при запуске, после ввода буквы диска выскакивает ошибка: нарушение прав доступа при чтении 0xffffffff. Указывается эта строка:
C++
1
LDS BX, cb.buf
Тут нужно в DS:BX поместить адрес буфера, куда читать. Как правильно сделать в этом месте, не знаю.

Добавлено через 8 минут
Полный код у меня такой:
Код
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
#include <stdio.h>
#include <malloc.h>
#include <dos.h>
#include <cctype>
#include <iostream>
 
typedef struct _EBPB_ 
{
        unsigned sectsize;
        char clustsize;
        unsigned ressecs;
        char fatcnt;
        unsigned rootsize;
        unsigned totsecs;
        char media;
        unsigned fatsize;
        unsigned seccnt;
        unsigned headcnt;
        unsigned hiddensec_low;
        unsigned hiddensec_hi;
        unsigned long drvsecs;
} EBPB;
 
typedef struct BOOT_ 
{
        char jmp[3];
        char oem[8];
        EBPB bpb;
        char drive;
        char reserved;
        char signature;
        unsigned volser_lo;
        unsigned volser_hi;
        char label[11];
        char fat_format[8];
        char boot_code[450];
} BOOT;
 
//union REGS reg;
//struct SREGS segreg;
 
struct
{
  unsigned long first_sect;
  unsigned nsect;
  void *buf;
} cb;
 
/**
* getboot
*
* Прочитать загрузочную запись
*
* int getboot(BOOT *boot, int drive);
*
*  boot   - указатель на буфер, в который
*           будет прочитана загрузочная запись
*
*  drive  - номер физического НМД
*           (0 - первый НМД, 1 - второй, ...)
**/
 
int getboot(BOOT *boot, unsigned char drive)
{
  cb.first_sect = 0;
  cb.nsect = 1;
  cb.buf = (void*)boot;
  __asm
{
    mov AH, 25H
    LDS BX, cb.buf
    mov CX,  1
    mov DX,  0
    mov AL,  drive
}
  __asm int 25h
 
  // Извлекаем из стека оставшееся там после
  // вызова прерывания слово
  __asm pop ax
  __asm jc err
  
  return 0;
err:
  return 1;
}
 
 
int main() 
{
 
  setlocale(0, "");
  
  BOOT *boot_rec;
  int i, status;
  unsigned char drive;
  printf("Чтение загрузочной записи "
         "логического диска\n");
                        
// Заказываем буфер для чтения BOOT-записи.
  boot_rec = (BOOT*)malloc(sizeof(*boot_rec));
 
// Запрашиваем диск, для которого необходимо
// выполнить чтение загрузочной записи.
  printf("\nВведите обозначение диска, для просмотра "
         "загрузочной записи (A, B, ...):");
 
  std::cin >> drive;
 
// Вычисляем номер дисковода
 drive = toupper(drive) - 'A';
 
// Читаем загрузочную запись в буфер
 status = getboot((BOOT*)boot_rec, drive);
 
// Если произошла ошибка (например, неправильно указано
// обозначение диска), завершаем работу программы
  if(status) 
  {
        printf("nОшибка при чтении BOOT-сектора");
        exit(-1);
  }
 printf("nСодержимое BOOT-сектора для диска %c", drive +'A');
 printf("n"
                        "nOEM - название фирмы и версия DOS - ");
 
 for (i = 0; i < 8; i++) printf("%c", boot_rec->oem[i]);
 
  printf("nНомер диска                       - %x"
                        "nПризнак расширенной BOOT-записи   - %c"
                        "nСерийный номер диска              - %04X-%04X"
                        "nМетка диска                       - ",
                        (unsigned char)boot_rec->drive,
                        boot_rec->signature,
                        boot_rec->volser_hi,
                        boot_rec->volser_lo);
 
  for (i = 0; i < 11; i++) printf("%c", boot_rec->label[i]);
 
  printf("nФормат FAT                        - ");
  for (i = 0; i < 8; i++) printf("%c", boot_rec->fat_format[i]);
 
  printf("nnИнформация из BPB:n");
 
  printf("nКоличество байтов в секторе       - %d"
                "nКоличество секторов в кластере    - %d"
                "nЗарезервировано секторов          - %d"
                "nКоличество копий FAT              - %d"
                "nМакс. количество файлов в корневом каталоге - %d"
                "nОбщее количество секторов на диске          - %d"
                "nБайт-описатель среды              - %x"
                "nКоличество секторов в FAT         - %d",
                boot_rec->bpb.sectsize,
                boot_rec->bpb.clustsize,
                boot_rec->bpb.ressecs,
                boot_rec->bpb.fatcnt,
                boot_rec->bpb.rootsize,
                boot_rec->bpb.totsecs,
                (unsigned char)boot_rec->bpb.media,
                boot_rec->bpb.fatsize);
 
  printf("nnИнформация из расширения BPB:n");
 
  printf("nСекторов на дорожке               - %d"
                "nКоличество головок                - %d"
                "nСкрытых секторов для диска < 32M  - %d"
                "nСкрытых секторов для диска >= 32M - %d"
                "nВсего секторов на диске           - %u",
                boot_rec->bpb.seccnt,
                boot_rec->bpb.headcnt,
                boot_rec->bpb.hiddensec_low,
                boot_rec->bpb.hiddensec_hi,
                boot_rec->bpb.totsecs);
 
// Освобождаем буфер
  free(boot_rec);
  
  system("pause");
  return 0;
}
 
Текущее время: 03:57. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru