Ru-Board.club
← Вернуться в раздел «Прикладное программирование»

» Assembler

Автор: delover
Дата сообщения: 20.07.2012 19:13
Ну я то про стек писал. Естественно в примере с интрудером таблица прерываний немного изменялась после чтения и всегда записывалась только в изменённом виде. При этом таймеров виндовс не было и надо было записывать исходя из событий. Последним что я помню - это было использование такого приёма в смеси с инструкцией RET. Мой мозг не успел осилить а времени у меня не было.
Автор: delover
Дата сообщения: 03.08.2012 21:57
Так это максимум - история, драм паузы не мой конёк.
Автор: akaGM
Дата сообщения: 04.08.2012 10:46
[deleted]
Автор: Maria93
Дата сообщения: 18.08.2012 20:59
[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]
Автор: akaGM
Дата сообщения: 18.08.2012 21:11
а ты уверена, что ответ на первый вопрос верный?
лично меня смущает последовательность

MOV Ax, SI
MOV Ax, Bx

что в итоге у тебя будет в регистре ах?
Автор: Maria93
Дата сообщения: 18.08.2012 21:15
Должно быть Bx или я неправа?
Автор: bomzzz
Дата сообщения: 18.08.2012 21:19
ты сначала загнал в ах одно число и тут же второе. в первой операции смысла нет
Автор: akaGM
Дата сообщения: 18.08.2012 21:21
Maria93
правильно, BX...
а что у нас в ВХ и что должно быть по условию задачи?:
Цитата:
1. Если ответ положительный - записать местоположение числа в регистр аккумулятора.
Автор: Maria93
Дата сообщения: 18.08.2012 21:33
Поняла, в ВХ у нас число, которое мы ищем, а нам нужен адрес этого числа. Спасибо.
Автор: akaGM
Дата сообщения: 18.08.2012 21:38
:)
давай вторую задачу решай...
Автор: Maria93
Дата сообщения: 18.08.2012 21:43
Подожди, пока с первой не закончили.

Значит надо

MOV A[SI], Bx
MOV Ax, A[SI]

Верно?
Автор: akaGM
Дата сообщения: 18.08.2012 21:55
Maria93
ну по условию адрес числа известен
Цитата:
По адресу ITEM находится неизвестное число.

а судя по твоим огрызкам кода достаточно в последовательности инструкций

MOV Ax, SI
MOV Ax, Bx

добавить всего один символ:

MOV Ax, SI
; MOV Ax, Bx

:)

думай почему так...
Автор: Maria93
Дата сообщения: 18.08.2012 22:03
Спасибо, буду думать.

P.S. "Огрызки кода", ха-ха.
Автор: ne_viens
Дата сообщения: 19.08.2012 21:15
Чтобы выполнить условия второго вопроса, надо 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]
Автор: MERCURY127
Дата сообщения: 19.08.2012 21:40
Используют. Ибо мозги преподов так и остались 16-битными и досовскими. Досовскими, потому что 16 бит, вообще-то, не только ДОС. В защищенном режиме ими можно адресовать до 16 Мб, и для множества осей тогда этого было более, чем достаточно...
Автор: ne_viens
Дата сообщения: 19.08.2012 21:55
А послать их ... на курсы, где к mov eax, esi; mov rax, r8; учат, нереально?
Студентам было бы проще непереучиватся потом.
Автор: MihaNix
Дата сообщения: 20.08.2012 23:45
Почему не канает такая конструкция?

mov ax, 7065
mov [0], al
mov [1], ah

Хотел разделить, чтобы получилось 70 и 65 - два отдельных числа...
чтобы не писать

mov ax, 70
mov [0], ax
mov ax, 65
mov [1],ax
... и тому подобное.
Автор: MERCURY127
Дата сообщения: 21.08.2012 00:52
Try
mov ax, 7065h
mov byte ptr x[0], al
mov byte ptr x[1], ah
Автор: akaGM
Дата сообщения: 21.08.2012 01:04
mov [0], ax

круто...
Автор: MihaNix
Дата сообщения: 21.08.2012 11:46
Да задание по архитектуре ЭВМ было - написать программу на ASM-е. Там именно такая конструкция требовалась. Писать обязательно в дебагере. Я в com файл оформлю и потом запущу на отладку, чтобы препод ход выполнения увидела...
Автор: akaGM
Дата сообщения: 21.08.2012 13:14

Цитата:
Там именно такая конструкция требовалась.

после такой конструкции не только три болта, резет не поможет...
Автор: MERCURY127
Дата сообщения: 21.08.2012 16:08

Цитата:
резет не поможет...

Автор: akaGM
Дата сообщения: 21.08.2012 16:27
и ничто не спасло бы отца русской демократии...
Автор: pavel1978
Дата сообщения: 22.08.2012 17:50
ДВС!
Управление пользовательской памятью осуществляется с использованием спец. структур 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. Как узнать ее содержимое (сегментный адрес наверное, не?) и проследить цепочку блоков? Каков процесс нахождения их? По какой формуле вычислять или какой программой это промониторить (хекс-редактором?). В общем, Всеведующие Форумчане, дайте алгоритм поиска решения этой задачи, пожалуйста!
Автор: MERCURY127
Дата сообщения: 22.08.2012 19:35
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, &regs, &regs, &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;
}
Автор: doktorpilulkin
Дата сообщения: 22.08.2012 19:42
просто у него такой вопрос, что ему только бы в этой теме ответили судя по всему
Автор: MERCURY127
Дата сообщения: 22.08.2012 19:44
ну и разумеется, священный RBIL (Ralf Brown's Interrupt List) курим до просветления....

Добавлено:
On-line version of RBIL http://www.delorie.com/djgpp/doc/rbinter/id/95/29.html

Добавлено:
pavel1978, Надеюсь, с английским у вас проблем нет? Иначе будете очень грустным программистом...
Автор: pavel1978
Дата сообщения: 22.08.2012 20:17

Цитата:
в гугле зобанели, да

А меня сюда, по Вашему, бабушка за ручку привела?! И в другой теме я задавал сей вопрос, отфутболили именно сюда. Если не знаешь ответа, нефиг ссылки "на весь интернет" постить. Ёхарный бабай, скажите хоть, как из М-блока 00A7h:0026h получить сегментный адрес, его длину? Мне блоки в задании надо просчитать "на бумажке чернилами". Не программно. Заканчивается это всё на Z-блоке 5Ah. По какой сраной формуле это считается?!


Добавлено:
где у этого адреса 00А7:0026h сегмент, где оффсет?
Автор: MERCURY127
Дата сообщения: 22.08.2012 20:50
pavel1978, вообще то я полный рабочий код дал. Посмотри его и разберись. А уж потом на бумаге рисуй.

Цитата:
где у этого адреса 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
Автор: pavel1978
Дата сообщения: 22.08.2012 21:50
Простите за тон. Каюсь.

Цитата:
где у этого адреса 00А7:0026h сегмент, где оффсет?

00А7 - сегмент, 0026 - смещение.


Т.е. согласно формуле
Физ Адрес = 10h*seg + offset = 10h*A7h + 26h = A96h , так?

Страницы: 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384

Предыдущая тема: .NET GUI компоненты


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.