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

почему в этой программе мы каждый раз perem=_BX? - C++

Восстановить пароль Регистрация
 
Zalik
2 / 2 / 0
Регистрация: 24.05.2010
Сообщений: 94
23.11.2011, 17:20     почему в этой программе мы каждый раз perem=_BX? #1
Выделить участок памяти в параграфах, занести в него массив элементов 1. char; 2. int, прочитать его и освободить участок памяти
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
#include<dos.h>
#include<stdio.h>
#include<conio.h>
void main(){
clrscr();
unsigned int perem;
int n=5,i,j,a[5]={1,2,3,4,5};
char b[5]="murad";
char *y;
int *x;
_AH=0x48;
_BX=1;
geninterrupt(0x21);
perem=_BX;
x=(int *)MK_FP(_BX,0);
for(i=0; i<n; i++ ){
x[i]=a[i];
printf("%d",a[i]);
}
getch();
 
_AH=0x49;
geninterrupt(0x21);
_AH=0x48;
_BX=1;
geninterrupt(0x21);
perem=_BX;
printf(" ");
y=(char *)MK_FP(_BX,0);
    for(j=0; j<n; j++ ){
    y[j]=b[j];
    printf("%c",b[j]);
    }
    getch();
    printf(" ");
    _AH=0x49;
    geninterrupt(0x21);
    _AH=0x48;
    _BX=1;
    geninterrupt(0x21);
    perem=_BX;
    printf("Свободно байт после освобождения памяти=%u\n",
        perem*16);
        getch();
        }
Друзья, почему в этой программе мы каждый раз perem=_BX?

Добавлено через 23 часа 46 минут
Кто может помочь?

Добавлено через 10 часов 5 минут
Помогите пожалуйста!
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
BRcr
 Аватар для BRcr
4003 / 2292 / 155
Регистрация: 03.02.2011
Сообщений: 5,064
Записей в блоге: 10
23.11.2011, 17:40     почему в этой программе мы каждый раз perem=_BX? #2
Цитата Сообщение от Zalik Посмотреть сообщение
Друзья, почему в этой программе мы каждый раз perem=_BX?
каждый раз это делается... ни зачем, так просто

Вот последний раз с целью:
Цитата Сообщение от Zalik Посмотреть сообщение
perem=_BX;
printf("Свободно байт после освобождения памяти=%u\n",
perem*16);
Вероятно, автор хотел дописать нечто подобное после каждого присваивания perem=_BX...:cofee:
Сыроежка
Заблокирован
23.11.2011, 17:47     почему в этой программе мы каждый раз perem=_BX? #3
Цитата Сообщение от Zalik Посмотреть сообщение
Выделить участок памяти в параграфах, занести в него массив элементов 1. char; 2. int, прочитать его и освободить участок памяти
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
#include<dos.h>
#include<stdio.h>
#include<conio.h>
void main(){
clrscr();
unsigned int perem;
int n=5,i,j,a[5]={1,2,3,4,5};
char b[5]="murad";
char *y;
int *x;
_AH=0x48;
_BX=1;
geninterrupt(0x21);
perem=_BX;
x=(int *)MK_FP(_BX,0);
for(i=0; i<n; i++ ){
x[i]=a[i];
printf("%d",a[i]);
}
getch();
 
_AH=0x49;
geninterrupt(0x21);
_AH=0x48;
_BX=1;
geninterrupt(0x21);
perem=_BX;
printf(" ");
y=(char *)MK_FP(_BX,0);
    for(j=0; j<n; j++ ){
    y[j]=b[j];
    printf("%c",b[j]);
    }
    getch();
    printf(" ");
    _AH=0x49;
    geninterrupt(0x21);
    _AH=0x48;
    _BX=1;
    geninterrupt(0x21);
    perem=_BX;
    printf("Свободно байт после освобождения памяти=%u\n",
        perem*16);
        getch();
        }
Друзья, почему в этой программе мы каждый раз perem=_BX?

Добавлено через 23 часа 46 минут
Кто может помочь?

Добавлено через 10 часов 5 минут
Помогите пожалуйста!
Потому что это ничто иное, как глупость!

Во-первых, после успешного завершения выделения памяти, значение регистра BX не определено. То есть вам повезет, если оно останется прежним, каким было установено до вызова соответствующего прерывания для выделения памяти.
Поэтому толку от этой команды никакой.

Иммеет смысл обращаться к этому регистру после выполнения прерывния только в том случае, если выделение памяти оказалось не успешеым. Тогда этот регистр возвращает размер наибольшего доступного блока памяти. Но в вашем коде нет проверки на то, успешно ли завершилось выделение памяти или нет. Более того в вашем коде предполагается, что BX будет содержать размер запрошенной памяти в параграфах после выполнения прерывания. Поэтому никакого толка от указанного выми предложения нет.

То есть если рассматривать данный кусок кода

C++
1
2
3
4
5
6
7
8
    _AH=0x48;
    _BX=1;
    geninterrupt(0x21);
    perem=_BX;
    printf("Свободно байт после освобождения памяти=%u\n",
        perem*16);
        getch();
        }
то здесь BX кладется равным 1, то есть запрашивается один паранраф памяти (размер параграфа памяти составляет 16 байт). Если выделение памяти (прерывание 0x48) прошло успешно, то BX так и останется равным 1 (это если прерывание не затирает этот регистр). Затем печатается глупая фраза

C++
1
2
3
4
    printf("Свободно байт после освобождения памяти=%u\n",
        perem*16);
        getch();
        }
которая всегда вам будет печатать значение 16. Проверьте это и, если я не прав, то сообщите мне об этом.
Zalik
2 / 2 / 0
Регистрация: 24.05.2010
Сообщений: 94
24.11.2011, 07:01  [ТС]     почему в этой программе мы каждый раз perem=_BX? #4
Спасибо. Попытаюсь объяснить это нашему преподу....
Deviaphan
24.11.2011, 09:00     почему в этой программе мы каждый раз perem=_BX?
  #5

Не по теме:

А я знаю, почему до сих пор программирование под ДОС преподают: как-то видел рекламу ноута с предустановленной "новейшей версией операционной системы Free DOS".

Yandex
Объявления
24.11.2011, 09:00     почему в этой программе мы каждый раз perem=_BX?
Ответ Создать тему
Опции темы

Текущее время: 01:16. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru