Ну я то про стек писал. Естественно в примере с интрудером таблица прерываний немного изменялась после чтения и всегда записывалась только в изменённом виде. При этом таймеров виндовс не было и надо было записывать исходя из событий. Последним что я помню - это было использование такого приёма в смеси с инструкцией RET. Мой мозг не успел осилить а времени у меня не было.
» Assembler
Так это максимум - история, драм паузы не мой конёк.
[deleted]
[more] [more] Задача:
Дана последовательность чисел, отсортированная в возрастающем порядке, которая находится в памяти, начиная с адреса SQNC. Количество данных в последовательности находится в памяти по адресу QNTT. По адресу ITEM находится неизвестное число.
Написать программу, которая проверит находится ли число из ячейки ITEM в данной последовательности.
1. Если ответ положительный - записать местоположение числа в регистр аккумулятора.
2. Если ответ отрицательный - добавить число в последовательность так, чтобы она осталась возрастающей. Кроме этого следует обновить содержимое ячейки QNTT, так, чтобы оно соответствовало новой длине последовательности.
---------------------------------------------------------------------------------------------------------
Ответ на первый вопрос:
...
START: MOV Ax Dseg
MOV Ds, Ax
MOV Cx, Ka
MOV SI offset A
MOV Bx, Num
LOOP: CMP Bx, [SI]
Je Inserting
JNZ NEXT
Next: INC SI
Sub Cx, 1
JNZ LOOP
Inserting: MOV Ax, SI
MOV Ax, Bx
JMP end
-----------------------------------------------------------------------------------------------------
Как отвечать на второй вопрос - не приложу ума, помогите пожалуста. [/more] [/more]
Дана последовательность чисел, отсортированная в возрастающем порядке, которая находится в памяти, начиная с адреса SQNC. Количество данных в последовательности находится в памяти по адресу QNTT. По адресу ITEM находится неизвестное число.
Написать программу, которая проверит находится ли число из ячейки ITEM в данной последовательности.
1. Если ответ положительный - записать местоположение числа в регистр аккумулятора.
2. Если ответ отрицательный - добавить число в последовательность так, чтобы она осталась возрастающей. Кроме этого следует обновить содержимое ячейки QNTT, так, чтобы оно соответствовало новой длине последовательности.
---------------------------------------------------------------------------------------------------------
Ответ на первый вопрос:
...
START: MOV Ax Dseg
MOV Ds, Ax
MOV Cx, Ka
MOV SI offset A
MOV Bx, Num
LOOP: CMP Bx, [SI]
Je Inserting
JNZ NEXT
Next: INC SI
Sub Cx, 1
JNZ LOOP
Inserting: MOV Ax, SI
MOV Ax, Bx
JMP end
-----------------------------------------------------------------------------------------------------
Как отвечать на второй вопрос - не приложу ума, помогите пожалуста. [/more] [/more]
а ты уверена, что ответ на первый вопрос верный?
лично меня смущает последовательность
MOV Ax, SI
MOV Ax, Bx
что в итоге у тебя будет в регистре ах?
лично меня смущает последовательность
MOV Ax, SI
MOV Ax, Bx
что в итоге у тебя будет в регистре ах?
Должно быть Bx или я неправа?
ты сначала загнал в ах одно число и тут же второе. в первой операции смысла нет
Maria93
правильно, BX...
а что у нас в ВХ и что должно быть по условию задачи?:
Цитата:
правильно, BX...
а что у нас в ВХ и что должно быть по условию задачи?:
Цитата:
1. Если ответ положительный - записать местоположение числа в регистр аккумулятора.
Поняла, в ВХ у нас число, которое мы ищем, а нам нужен адрес этого числа. Спасибо.
:)
давай вторую задачу решай...
давай вторую задачу решай...
Подожди, пока с первой не закончили.
Значит надо
MOV A[SI], Bx
MOV Ax, A[SI]
Верно?
Значит надо
MOV A[SI], Bx
MOV Ax, A[SI]
Верно?
Maria93
ну по условию адрес числа известен
Цитата:
а судя по твоим огрызкам кода достаточно в последовательности инструкций
MOV Ax, SI
MOV Ax, Bx
добавить всего один символ:
MOV Ax, SI
; MOV Ax, Bx
:)
думай почему так...
ну по условию адрес числа известен
Цитата:
По адресу ITEM находится неизвестное число.
а судя по твоим огрызкам кода достаточно в последовательности инструкций
MOV Ax, SI
MOV Ax, Bx
добавить всего один символ:
MOV Ax, SI
; MOV Ax, Bx
:)
думай почему так...
Спасибо, буду думать.
P.S. "Огрызки кода", ха-ха.
P.S. "Огрызки кода", ха-ха.
Чтобы выполнить условия второго вопроса, надо ITEM последовательно сравнивать с каждым элементом SQNCа, и, как только найден элемент значением побольше, сдвигать его и все остальные на одну позицию дальше и вставлять в освободившеесе место текущий ITEM.
Если 16bit не обязательно (и где их ещё используют в 21 веке?!), то как-то так:
[more]
.586
.model flat,stdcall
option casemap:none
include \masm32\include\kernel32.inc
includelib \masm32\lib\kernel32.lib
.data
SQNC db 100h dup(0)
QNTT dd 0
ITEM db 0
.code
;###############################################
memmove proc USES esi edi, dst, src, len
std
mov ecx, len
mov edi, dst
mov esi, src
lea edi, [edi+ecx-1]
lea esi, [esi+ecx-1]
rep movsb
cld
ret
memmove endp
;###############################################
main proc USES edi
lea edi, [SQNC-1]
mov ecx, QNTT
;------------------------------------\
_loop:
inc edi
dec ecx
or ecx, ecx
jns @F
jmp insert ;insert @end
@@:
mov al, [edi]
cmp al, ITEM
jne @F
mov eax, edi
jmp _ret ;return a pointer
@@:
jb _loop
;------------------------------------/
mov edx, QNTT
add edx, offset SQNC
sub edx, edi
invoke memmove, ADDR[edi+1], edi, edx ;shift up by one char
insert:
mov al, ITEM
stosb
inc QNTT
xor eax, eax
_ret:
ret
main endp
;###############################################
start:
push esi
mov esi, 1000h
@@:
rdtsc
mov ITEM, al
invoke main
dec esi
jnz @B
pop esi
invoke ExitProcess, 0
END start
[/more]
Если 16bit не обязательно (и где их ещё используют в 21 веке?!), то как-то так:
[more]
.586
.model flat,stdcall
option casemap:none
include \masm32\include\kernel32.inc
includelib \masm32\lib\kernel32.lib
.data
SQNC db 100h dup(0)
QNTT dd 0
ITEM db 0
.code
;###############################################
memmove proc USES esi edi, dst, src, len
std
mov ecx, len
mov edi, dst
mov esi, src
lea edi, [edi+ecx-1]
lea esi, [esi+ecx-1]
rep movsb
cld
ret
memmove endp
;###############################################
main proc USES edi
lea edi, [SQNC-1]
mov ecx, QNTT
;------------------------------------\
_loop:
inc edi
dec ecx
or ecx, ecx
jns @F
jmp insert ;insert @end
@@:
mov al, [edi]
cmp al, ITEM
jne @F
mov eax, edi
jmp _ret ;return a pointer
@@:
jb _loop
;------------------------------------/
mov edx, QNTT
add edx, offset SQNC
sub edx, edi
invoke memmove, ADDR[edi+1], edi, edx ;shift up by one char
insert:
mov al, ITEM
stosb
inc QNTT
xor eax, eax
_ret:
ret
main endp
;###############################################
start:
push esi
mov esi, 1000h
@@:
rdtsc
mov ITEM, al
invoke main
dec esi
jnz @B
pop esi
invoke ExitProcess, 0
END start
[/more]
Используют. Ибо мозги преподов так и остались 16-битными и досовскими. Досовскими, потому что 16 бит, вообще-то, не только ДОС. В защищенном режиме ими можно адресовать до 16 Мб, и для множества осей тогда этого было более, чем достаточно...
А послать их ... на курсы, где к mov eax, esi; mov rax, r8; учат, нереально?
Студентам было бы проще непереучиватся потом.
Студентам было бы проще непереучиватся потом.
Почему не канает такая конструкция?
mov ax, 7065
mov [0], al
mov [1], ah
Хотел разделить, чтобы получилось 70 и 65 - два отдельных числа...
чтобы не писать
mov ax, 70
mov [0], ax
mov ax, 65
mov [1],ax
... и тому подобное.
mov ax, 7065
mov [0], al
mov [1], ah
Хотел разделить, чтобы получилось 70 и 65 - два отдельных числа...
чтобы не писать
mov ax, 70
mov [0], ax
mov ax, 65
mov [1],ax
... и тому подобное.
Try
mov ax, 7065h
mov byte ptr x[0], al
mov byte ptr x[1], ah
mov ax, 7065h
mov byte ptr x[0], al
mov byte ptr x[1], ah
mov [0], ax
круто...
круто...
Да задание по архитектуре ЭВМ было - написать программу на ASM-е. Там именно такая конструкция требовалась. Писать обязательно в дебагере. Я в com файл оформлю и потом запущу на отладку, чтобы препод ход выполнения увидела...
Цитата:
Там именно такая конструкция требовалась.
после такой конструкции не только три болта, резет не поможет...
Цитата:
резет не поможет...
и ничто не спасло бы отца русской демократии...
ДВС!
Управление пользовательской памятью осуществляется с использованием спец. структур 1. таблицы таблиц (list of list, или сокр-но lol) и
2. управляющих блоков памяти (memory control block, MCB)
Внимание, вопрос знатокам. Адрес lol = 00A7h:0026h. Как узнать ее содержимое (сегментный адрес наверное, не?) и проследить цепочку блоков? Каков процесс нахождения их? По какой формуле вычислять или какой программой это промониторить (хекс-редактором?). В общем, Всеведующие Форумчане, дайте алгоритм поиска решения этой задачи, пожалуйста!
Добавлено:
ДВС!
Управление пользовательской памятью осуществляется с использованием спец. структур 1. таблицы таблиц (list of list, или сокр-но lol) и
2. управляющих блоков памяти (memory control block, MCB)
Внимание, вопрос знатокам. Адрес lol = 00A7h:0026h. Как узнать ее содержимое (сегментный адрес наверное, не?) и проследить цепочку блоков? Каков процесс нахождения их? По какой формуле вычислять или какой программой это промониторить (хекс-редактором?). В общем, Всеведующие Форумчане, дайте алгоритм поиска решения этой задачи, пожалуйста!
Управление пользовательской памятью осуществляется с использованием спец. структур 1. таблицы таблиц (list of list, или сокр-но lol) и
2. управляющих блоков памяти (memory control block, MCB)
Внимание, вопрос знатокам. Адрес lol = 00A7h:0026h. Как узнать ее содержимое (сегментный адрес наверное, не?) и проследить цепочку блоков? Каков процесс нахождения их? По какой формуле вычислять или какой программой это промониторить (хекс-редактором?). В общем, Всеведующие Форумчане, дайте алгоритм поиска решения этой задачи, пожалуйста!
Добавлено:
ДВС!
Управление пользовательской памятью осуществляется с использованием спец. структур 1. таблицы таблиц (list of list, или сокр-но lol) и
2. управляющих блоков памяти (memory control block, MCB)
Внимание, вопрос знатокам. Адрес lol = 00A7h:0026h. Как узнать ее содержимое (сегментный адрес наверное, не?) и проследить цепочку блоков? Каков процесс нахождения их? По какой формуле вычислять или какой программой это промониторить (хекс-редактором?). В общем, Всеведующие Форумчане, дайте алгоритм поиска решения этой задачи, пожалуйста!
pavel1978, в гугле зобанели, да ? как я их понимаю...
https://groups.google.com/forum/?fromgroups=#!topic/alt.msdos.programmer/
не асм, но что есть, то есть...
[more=код]
Код:
>Everytime I try to search for "how mem.exe works" or something like
>that I end up with "you need to use int21h/52h to get list-of-lists
>and walk through the MCB chain"... Well, I tried this:
This works for me:
/*----------------------------------------------------------------------------
Displays DOS MCB chain
Compile with Turbo C, Borland C, or Watcom C
----------------------------------------------------------------------------*/
#include <stdio.h>
#include <dos.h>
typedef unsigned short uint16_t;
/* mcb_t must be a packed struct: */
#pragma pack(1)
/* That doesn't work for Turbo C++ 1.0, so do this: */
#if defined(__TURBOC__)
#if __TURBOC__==0x296
#pragma option -a-
#endif
#endif
typedef struct
{
char type;
uint16_t owner_psp;
uint16_t size; /* in paragraphs */
char unused[3];
char owner_name[8];
} mcb_t;
/*****************************************************************************
*****************************************************************************/
static void wrstr(char far *s)
{
int i;
for(i = 0; i < 8; i++)
{
putchar(*s < ' ' ? '.' : *s);
s++;
}
}
/*****************************************************************************
debug function
*****************************************************************************/
#define BPERL 16 /* byte/line for dump */
void dump(void far *data_p, unsigned count)
{
unsigned char far *data = (unsigned char far *)data_p;
unsigned byte1, byte2;
while(count != 0)
{
for(byte1 = 0; byte1 < BPERL; byte1++)
{
if(count == 0)
break;
printf("%02X ", data[byte1]);
count--;
}
printf("\t");
for(byte2 = 0; byte2 < byte1; byte2++)
{
if(data[byte2] < ' ')
printf(".");
else
printf("%c", data[byte2]);
}
printf("\n");
data += BPERL;
}
}
/*****************************************************************************
*****************************************************************************/
int main(void)
{
struct SREGS sregs;
union REGS regs;
mcb_t far *mcb;
unsigned s;
regs.x.ax = 0x5200;
int86x(0x21, ®s, ®s, &sregs);
/* segment of MCB list entry
Watcom C has no 'peek'
s = peek(sregs.es - 1, regs.x.bx + 14); */
s = *(uint16_t far *)MK_FP(sregs.es - 1, regs.x.bx + 14);
while(1)
{
mcb = (mcb_t far *)MK_FP(s, 0);
/*dump(mem, sizeof(mcb_t));*/
printf("adr=%04X, owner_psp=%04X, size=%6lu, owner=",
FP_SEG(mcb), mcb->owner_psp, mcb->size * 16uL);
wrstr(mcb->owner_name);
printf(", contents=");
wrstr(&((char far *)mcb)[16]);
printf("\n");
if(mcb->type == 0x5A)
break;
s += (1 + mcb->size);
}
printf("adr=%04X\n", FP_SEG(mcb));
return 0;
}
https://groups.google.com/forum/?fromgroups=#!topic/alt.msdos.programmer/
не асм, но что есть, то есть...
[more=код]
Код:
>Everytime I try to search for "how mem.exe works" or something like
>that I end up with "you need to use int21h/52h to get list-of-lists
>and walk through the MCB chain"... Well, I tried this:
This works for me:
/*----------------------------------------------------------------------------
Displays DOS MCB chain
Compile with Turbo C, Borland C, or Watcom C
----------------------------------------------------------------------------*/
#include <stdio.h>
#include <dos.h>
typedef unsigned short uint16_t;
/* mcb_t must be a packed struct: */
#pragma pack(1)
/* That doesn't work for Turbo C++ 1.0, so do this: */
#if defined(__TURBOC__)
#if __TURBOC__==0x296
#pragma option -a-
#endif
#endif
typedef struct
{
char type;
uint16_t owner_psp;
uint16_t size; /* in paragraphs */
char unused[3];
char owner_name[8];
} mcb_t;
/*****************************************************************************
*****************************************************************************/
static void wrstr(char far *s)
{
int i;
for(i = 0; i < 8; i++)
{
putchar(*s < ' ' ? '.' : *s);
s++;
}
}
/*****************************************************************************
debug function
*****************************************************************************/
#define BPERL 16 /* byte/line for dump */
void dump(void far *data_p, unsigned count)
{
unsigned char far *data = (unsigned char far *)data_p;
unsigned byte1, byte2;
while(count != 0)
{
for(byte1 = 0; byte1 < BPERL; byte1++)
{
if(count == 0)
break;
printf("%02X ", data[byte1]);
count--;
}
printf("\t");
for(byte2 = 0; byte2 < byte1; byte2++)
{
if(data[byte2] < ' ')
printf(".");
else
printf("%c", data[byte2]);
}
printf("\n");
data += BPERL;
}
}
/*****************************************************************************
*****************************************************************************/
int main(void)
{
struct SREGS sregs;
union REGS regs;
mcb_t far *mcb;
unsigned s;
regs.x.ax = 0x5200;
int86x(0x21, ®s, ®s, &sregs);
/* segment of MCB list entry
Watcom C has no 'peek'
s = peek(sregs.es - 1, regs.x.bx + 14); */
s = *(uint16_t far *)MK_FP(sregs.es - 1, regs.x.bx + 14);
while(1)
{
mcb = (mcb_t far *)MK_FP(s, 0);
/*dump(mem, sizeof(mcb_t));*/
printf("adr=%04X, owner_psp=%04X, size=%6lu, owner=",
FP_SEG(mcb), mcb->owner_psp, mcb->size * 16uL);
wrstr(mcb->owner_name);
printf(", contents=");
wrstr(&((char far *)mcb)[16]);
printf("\n");
if(mcb->type == 0x5A)
break;
s += (1 + mcb->size);
}
printf("adr=%04X\n", FP_SEG(mcb));
return 0;
}
просто у него такой вопрос, что ему только бы в этой теме ответили судя по всему
ну и разумеется, священный RBIL (Ralf Brown's Interrupt List) курим до просветления....
Добавлено:
On-line version of RBIL http://www.delorie.com/djgpp/doc/rbinter/id/95/29.html
Добавлено:
pavel1978, Надеюсь, с английским у вас проблем нет? Иначе будете очень грустным программистом...
Добавлено:
On-line version of RBIL http://www.delorie.com/djgpp/doc/rbinter/id/95/29.html
Добавлено:
pavel1978, Надеюсь, с английским у вас проблем нет? Иначе будете очень грустным программистом...
Цитата:
в гугле зобанели, да
А меня сюда, по Вашему, бабушка за ручку привела?! И в другой теме я задавал сей вопрос, отфутболили именно сюда. Если не знаешь ответа, нефиг ссылки "на весь интернет" постить. Ёхарный бабай, скажите хоть, как из М-блока 00A7h:0026h получить сегментный адрес, его длину? Мне блоки в задании надо просчитать "на бумажке чернилами". Не программно. Заканчивается это всё на Z-блоке 5Ah. По какой сраной формуле это считается?!
Добавлено:
где у этого адреса 00А7:0026h сегмент, где оффсет?
pavel1978, вообще то я полный рабочий код дал. Посмотри его и разберись. А уж потом на бумаге рисуй.
Цитата:
00А7 - сегмент, 0026 - смещение.
Цитата:
http://www.delorie.com/djgpp/doc/rbinter/it/28/16.html
Код:
00h BYTE block type: 5Ah if last block in chain, otherwise 4Dh
01h WORD PSP segment of owner or special flag value (see #01629)
03h WORD size of memory block in paragraphs
Цитата:
где у этого адреса 00А7:0026h сегмент, где оффсет?
00А7 - сегмент, 0026 - смещение.
Цитата:
скажите хоть, как из М-блока 00A7h:0026h получить сегментный адрес, его длину?
http://www.delorie.com/djgpp/doc/rbinter/it/28/16.html
Код:
00h BYTE block type: 5Ah if last block in chain, otherwise 4Dh
01h WORD PSP segment of owner or special flag value (see #01629)
03h WORD size of memory block in paragraphs
Простите за тон. Каюсь.
Цитата:
Т.е. согласно формуле
Физ Адрес = 10h*seg + offset = 10h*A7h + 26h = A96h , так?
Цитата:
где у этого адреса 00А7:0026h сегмент, где оффсет?
00А7 - сегмент, 0026 - смещение.
Т.е. согласно формуле
Физ Адрес = 10h*seg + offset = 10h*A7h + 26h = A96h , так?
Страницы: 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
Предыдущая тема: .NET GUI компоненты
Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.