Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.98/55: Рейтинг темы: голосов - 55, средняя оценка - 4.98
5500 / 4895 / 831
Регистрация: 04.06.2011
Сообщений: 13,587

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

03.09.2012, 13:23. Показов 12184. Ответов 34
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Есть такой код:
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
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, int drive)
{
  cb.first_sect = 0;
  cb.nsect = 1;
  cb.buf = (void*)boot;
 
  _BX  = FP_OFF(&cb);
  _DS = FP_SEG(&cb);
  _CX  = 0xffff;
  _DX  = 0;
  _AX  = drive;
 
  asm int 25h
 
  // Извлекаем из стека оставшееся там после
  // вызова прерывания слово
  asm pop ax
  asm jc err
 
  return(0);
err:
  return(1);
}
В функции, как я понимаю, часть кода на ассемблере. Как его правильно вставить в код на MSVC?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
03.09.2012, 13:23
Ответы с готовыми решениями:

Как правильно вставить jQuery код в код страницы сайта?
привет всем:) у меня возникла проблема, когда я свой jQuery код вставляю в код html главной страницы , у меня моя анимация оказывается в...

Как правильно вставить код Google AdSense
Здравствуйте. Я вставил рекламный код гугла адсенсе вниз сайта , но его не видно на сайте???? Помогите правильно вставить код ...

Как правильно вставить ассемблерный код в Делфи?
Как правило вставить ассемблер в делфи Примерно набросал А как правильно не знаю Условие задачи : найти минимальный и максимальный...

34
5500 / 4895 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
03.09.2012, 15:48  [ТС]
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от CheshireCat Посмотреть сообщение
А во-вторых, инструкция int (21h) относится к привилегированным, и попытка выполнить ее в юзер-моде вероятнее всего приведет к появлению такого премиленького окошечка: "Программа выполнила недопустимую операцию и будет закрыта."
Очень может быть, но как код до этого довести? Или, каким спобом прочитать логический сектор жёсткого диска?
0
Twilight Parasite
 Аватар для Invader_Zim
154 / 150 / 7
Регистрация: 21.07.2011
Сообщений: 908
03.09.2012, 15:57
alsav22, есть сишные функции. Есть указатели. Первый сектор первого диска B1 кажись зовется
0
5500 / 4895 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
03.09.2012, 16:01  [ТС]
Цитата Сообщение от Invader_Zim Посмотреть сообщение
есть сишные функции
Какие?
0
Эксперт С++
2924 / 1274 / 114
Регистрация: 27.05.2008
Сообщений: 3,465
03.09.2012, 16:09
Цитата Сообщение от alsav22 Посмотреть сообщение
Или, каким спобом прочитать логический сектор жёсткого диска?
В современных ОС из юзер-моды - никак. Современные ОС (что Win, что Lin....) защищают систему от слишком шустрых ручонок пользователя, и подобные действия разрешают выполнить только из драйвера уровня ядра, который работает в кольце 0 при наивысших привилегиях.

Добавлено через 4 минуты
Да, вот еще какой совет могу дать: поставь себе виртуалку (VMWare, VirtualPC, etc...) или DosBox, надень на него MSDOS + Tubro C++, и экспериментируй, скока пожелаешь....
1
03.09.2012, 16:19  [ТС]

Не по теме:

Цитата Сообщение от CheshireCat Посмотреть сообщение
Да, вот еще какой совет могу дать: поставь себе виртуалку (VMWare, VirtualPC, etc...) или DosBox, надень на него MSDOS + Tubro C++, и экспериментируй, скока пожелаешь....
В общем-то, это не мне нужно. Ошибка при компиляции программы Не понятно только, если дают такие задания, как они представляют решение?

0
03.09.2012, 16:32

Не по теме:

alsav22,

#include <dos.h>
Однозначно намекает, что код должен работать под dosом.

0
03.09.2012, 16:38  [ТС]

Не по теме:

Цитата Сообщение от ForEveR Посмотреть сообщение

Не по теме:

alsav22,
Однозначно намекает, что код должен работать под dosом.

А компилироваться где? Как её написать, чтобы скомпилировать?

0
В астрале
Эксперт С++
 Аватар для ForEveR
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
03.09.2012, 16:40
alsav22, Что в досе работало - под тем и компилироваться. Что-нибудь Борландовское к примеру.
0
5500 / 4895 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
03.09.2012, 16:48  [ТС]
Цитата Сообщение от ForEveR Посмотреть сообщение
alsav22, Что в досе работало - под тем и компилироваться. Что-нибудь Борландовское к примеру.
По другому никак?
0
В астрале
Эксперт С++
 Аватар для ForEveR
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
03.09.2012, 16:52
alsav22, ну хм. если программа написана под dos, где она еще может компилироваться? Уже советовали с виртуальными машинками или с DosBOX-ом попробовать.
1
Эксперт С++
2924 / 1274 / 114
Регистрация: 27.05.2008
Сообщений: 3,465
03.09.2012, 17:04
Цитата Сообщение от alsav22 Посмотреть сообщение
Не понятно только, если дают такие задания, как они представляют решение?
Я бы, кстати, спросил бы об этом у "них"...... (препов? видать, заснувших лет этак 20 назад в состоянии анабиоза :-) - и так из этого состояния и не вышедших...)
1
 Аватар для Kastaneda
5232 / 3206 / 362
Регистрация: 12.12.2009
Сообщений: 8,143
Записей в блоге: 2
03.09.2012, 17:38
Не думаю, что чтение - привилегированная инструкция, привилегированным обычно делают запись (тот же sgtr доступен в user mode, а вот lgtr уже нет), поэтому тут проблем быть не должно. Думаю это может работать даже по Win XP (только что именно будет прочитано - вопрос)
Если сидишь под семеркой, то, как уже писали, поставь какой-нибудь DosBox (или DosEmu, не знаю есть ли он под винду), запусти там Turbo C++, компилируй и запускай.
1
 Аватар для Kastaneda
5232 / 3206 / 362
Регистрация: 12.12.2009
Сообщений: 8,143
Записей в блоге: 2
03.09.2012, 18:05
Мне самому аж интересно стало, в общем в таком виде у меня скомпилилось
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
#include <stdio.h>
#include <dos.h>
 
struct
{
  unsigned long first_sect;
  unsigned nsect;
  void *buf;
} cb;
 
/**
* getboot
*
* Прочитать загрузочную запись
*
* int getboot(BOOT *boot, int drive);
*
*  boot   - указатель на буфер, в который
*           будет прочитана загрузочная запись
*
*  drive  - номер физического НМД
*           (0 - первый НМД, 1 - второй, ...)
**/
 
int getboot(char *boot, int drive) // лень было гуглить, что такое BOOT, поэтому просто заменил на char
{
  cb.first_sect = 0;
  cb.nsect = 1;
  cb.buf = (void*)boot;
 
  _BX  = FP_OFF(&cb);
  _DS = FP_SEG(&cb);
  _CX  = 0xffff;
  _DX  = 0;
  _AX  = drive;
 
  asm int 25h
 
  // Извлекаем из стека оставшееся там после
  // вызова прерывания слово
  asm pop ax
  asm jc err
 
  return(0);
err:
  return(1);
}
 
int main()
{
  char buf[512];
  int res = getboot(buf, 0);
 
  printf ("Res = %d\n", res);
 
  return 0;
}
результат компиляции


и результат выполнения


как видно, функция чтения вернула 1, значит что-то не так. Но мне уже лень разбираться, что не так

P.S. Linux - doxbox 0.74 и Borland C++ 3.1
0
 Аватар для Kastaneda
5232 / 3206 / 362
Регистрация: 12.12.2009
Сообщений: 8,143
Записей в блоге: 2
03.09.2012, 18:28
вот это
Assembler
1
jc err
очень смущает, т.к. pop не влияет на флаги, поэтому переход может происходить по совершенно другой причине.
Код сам писал?

Добавлено через 1 минуту
А не, все нормально, погуглил
Ошибки, возникающие в процессе INT 25H/26H, НЕ обрабатываются обработчиком кртических ошибок INT 24H . при выходе из INT 25H/26H, DOS-BIOS взводит флаг переноса (CF=1), когда встречается ошибка. Если установлен флаг CF:

AL = ошибка устройства (0-0cH) - аналогично битам 0-7 в DI для INT 24H - это
AL = один из кодов ошибок 13H-1fH (без 13H) в списке кодов ошибок DOS
AH = 80H = attachment failed to respond
AH = 40H = ошибка операции поиска на диске
AH = 08H = неверная контрольная сумма (CRC) при чтении дискеты
AH = 04H = запрошенный сектор не найден
AH = 03H = попытка записи на защищенную от записи дискету
AH = 02H = ошибка, отличная от перечисленных выше
0
5500 / 4895 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
03.09.2012, 19:20  [ТС]
Цитата Сообщение от Kastaneda Посмотреть сообщение
Код сам писал?
Нет. Вопрос на форуме Ошибка при компиляции программы Код в инете выложен http://vmg.pp.ua/books/Копьюте... EWROOT.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;
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
03.09.2012, 19:20

Как правильно вставить код Assembler в function?
Как правельно вставить код Assembler в function program Project1; {$APPTYPE CONSOLE} uses SysUtils; function...

Как правильно вставить код (javascript) Google Analytics?
Я новичок в этой теме. Когда вставляю код Google Analytics (код взят без изменений со страницы Google Analytics) на страницу сайта...

как правильно записать в ассемблере эти 3 строки
вот эти 3 строки: mov c, a mov a, a mov a, c а это мои варианты записи, но нерабочие: mov al, _array mov _array, _array ...

Куда правильно вставить код для заднего фона в моём случае
Народ, у меня задача разместить картинку за этим салатовым квадратом: http://halvamaster.xhc.ru/#list1.html Есть код: &lt;style&gt;...

Как вставить div в PHP код (в echo) - исправить код
Народ как вставить div в php код точнее в echo В этот код:&lt;?php //отсеивание $dir = &quot;MP3 PLAYER/&quot;; //задаём имя...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
35
Ответ Создать тему
Новые блоги и статьи
Запустил конкурс "тем и промптов для текстовых квестов созданных почти чисто ИИ"
Adler 06.10.2026
Всем привет! За последние три-четыре дня я создал более 16 текстовых квестовых игр используя преимущественно по одному запросу к ИИ на игру. Мне так понравилось смотреть все ветки/ сцены во всех. . .
ИИ не может найти нужный язык в списке
Supersumestria 05.10.2026
Я ему даю вот такое изображение и прошу найти и подчеркнуть немецкий язык. Возвращает он вот это: https:/ / i. **********/ vqBWLe2. png Нужную строчку в 3й колонке просто выдумал. . Это. . .
Новая последняя моя музыка в SUNO
zorxor 05.10.2026
Здравствуйте, дорогие мои друзья! С большой радостью я хотел бы представить вам свою новую последнею музыку, которую сгенерировала мне по моей просьбе нейросеть SUNO. С уважением, zorxor. Это. . .
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js. В помощники взял Яндекс-Алису. Было создано три зала на разные интересы. исторические и ретро сериал Хичкок. . .
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#. Название изменил на ColorStep. Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами: - ВидТО (СправочникСсылка. ВидыТО); - ВидГСМ. . .
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru