Все технические форумы на одном сайте Удобный поиск информации с популярных форумов в одном месте
Вопрос: Где находятся значения массива после обработки?

Ребят, исходный массив init_arr со значениями 12341234 находится в ds:0200, а где найти массив после преобразования res_arr со значениями 124124?

Задание:
Подготовить средствами отладчика в памяти данные для задачи: массив кодов {a(1),a(2),...,a(n)}. Адрес массива и число элементов определить самостоятельно. Написать программу, выполняющую пересылку элементов исходного массива (или преобразование и пересылку), удовлетворяющих некоторому условию в другую область памяти.
Условие: Коды, в которых первая половина не равна второй половине.

Код ASM
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
s1 segment para stack 'stack'
db 100h dup(0)
s1 ends
 
d1 segment para public 'data'
  init_arr db 31h, 32h, 33h, 34h, 31h, 32h, 33h, 34h        ; начальные значения
  res_arr db 8 dup (0)
  
d1 ends
 
c1 segment para public 'code'
  assume cs:c1,ds:d1,ss:s1
  
start:
  mov ax, s1
  mov ss, ax
  mov sp, 0  
 
  mov ax,d1
  mov ds,ax
  mov cx,8d     ; счётчик, кол-во элементов в массиве исходных данных
 
  mov di,offset init_arr
  mov si,offset res_arr
  
  lp:                 ;цикл_начало
    mov ah, ds:[di]
    mov dh, ah    ; договоримся: в dh - _вторая_ часть числа
    mov dl, ah    ; в dl - первая
    and dh, 00Fh ; обнуляем левую часть, будет 00xx
    ; shr dl, 4 ; сдвигаем на 4 вправо, будет 00yy
    ; сразу на 4е не заработало
    shr dl, 1
    shr dl, 1
    shr dl, 1
    shr dl, 1 
 
    cmp dl, dh          ; сравниваем
    je metka          ; переход на metka если первая часть равна второй
 
    mov byte ptr ds:[si], ah    ; удовлетворяет условию, копируем
    inc si                      ; увеличиваем индекс приёмника
    metka: inc di               ; источника
    loop lp         ;цикл_конец
  
  mov word ptr ds:[si+1],36d ; добавляем в конец символ '$', чтобы обозначить конец выводимой 
 
строки
                 ; если у нас в массиве числа, они будут выводиться как ASCII коды
  mov dx,offset res_arr
  mov ah,9
  int 21h
  mov ax,4c00h
  int 21h
  
c1 ends
 
end start
Ответ: Мда.
1) Вы перепутали название регистров:
SI (Source Index) - индекс источника;
DI (Destination Index) - индекс приемника.
Не страшно, но как-то сбивает с толку, если уже знаеш команды работы со строками(LODS, STOS и т.д.).
2) строки:
Код ASM
1
2
3
15  mov ax, s1
16  mov ss, ax
17  mov sp, 0
Оно Вам нужно? Загрузщик системы сам прочитает из заголовка программы значения этих регистров и поставит нужные значения.
3)Судя по коду:
Код ASM
1
2
3
4
5
6
7
8
9
28    mov dh, ah    ; договоримся: в dh - _вторая_ часть числа
29    mov dl, ah    ; в dl - первая
30    and dh, 00Fh ; обнуляем левую часть, будет 00xx
31    ; shr dl, 4 ; сдвигаем на 4 вправо, будет 00yy
32    ; сразу на 4е не заработало
33    shr dl, 1
34    shr dl, 1
35   shr dl, 1
36    shr dl, 1
Вы пытаетесь сравнить старшую половину байта с младшей. с.31 это команда 186-го процессора, разрешите эти команды процессора и будет Вам счастье. Или можно обратить внимание на команду ААМ(D4h 0Ah), пишете в коде db 0D4h, 0Fh и этот байт будет разделен по регистровой паре АХ как неупакованое 16-ое число. Т.е. код превращается в:
Код ASM
1
2
3
4
5
push    ax
db  0d4h,0fh
cmp ah,al
pop ax
je  metka
Добавлено через 4 часа 11 минут
Сообщение от azusa_nakano
исходный массив init_arr со значениями 12341234 находится в ds:0200, а где найти массив после преобразования res_arr со значениями 124124?
Вам нужно обратить внимание на строчки:
Код ASM
1
2
3
4
19  mov ax,d1
 
23  mov di,offset init_arr
24  mov si,offset res_arr
стр.19 число в команде, должно находится в регистре DS
В стр. 23 и 24 записанны начала обоих массивов.
Вопрос: странная проблема - после цикла не выполняется код

Добрый день, есть код, элементарный:
Код:

Procedure SendListTrabnsferPower(hash:String);
var
temp: TStrings;
i: Integer;
begin
   showmessage(hash);
   temp:=TStringlist.Create;
   temp.Add('[transferpower:listupdate]');

     for I := 0 to TransferPowerForm.TransferList.Items.Count-1 do
      if TransferPowerForm.TransferList.Items.Item[i].Caption=hash then
      begin
        temp.Add('tansfpower:stringnext');
        temp.Add(TransferPowerForm.TransferList.Items.Item[i].SubItems.Strings[1]);
        temp.Add(TransferPowerForm.TransferList.Items.Item[i].SubItems.Strings[2]);
        temp.Add(TransferPowerForm.TransferList.Items.Item[i].SubItems.Strings[3]);
        temp.Add(TransferPowerForm.TransferList.Items.Item[i].SubItems.Strings[4]);
      end;

   showmessage(hash);
     DataModule342.TerminalToCenter.Socket.Connections[GetConnectCenter(hash)].SendText('<'+inttostr(length(temp.Text))+'>'+temp.Text);
temp.Free;
end;

showmessage(hash); в начале
и такой же в конце, по идее должно быть показано 2 окна..

Что мы емеем:
выполнение программы доходит до цикла и далее выполнение процедуры не происходит...
как будто там кода нет...

showmessage срабатывает один раз (вставил для теста)
отправка не происходит, хоть close там пиши... по баробану




++++



Убрал
Код:

     for I := 0 to TransferPowerForm.TransferList.Items.Count-1 do
      if TransferPowerForm.TransferList.Items.Item[i].Caption=hash then
      begin
        temp.Add('tansfpower:stringnext');
        temp.Add(TransferPowerForm.TransferList.Items.Item[i].SubItems.Strings[1]);
        temp.Add(TransferPowerForm.TransferList.Items.Item[i].SubItems.Strings[2]);
        temp.Add(TransferPowerForm.TransferList.Items.Item[i].SubItems.Strings[3]);
        temp.Add(TransferPowerForm.TransferList.Items.Item[i].SubItems.Strings[4]);
      end;

происходит выполнение 2х showmessage...
Или я уже..... Или код после цикла должен выполнятся в любом случае, в независимости что будет найдено \ не найден в цикле..
Ответ:
Цитата:
Сообщение от Serge_Bliznykov
пустой?!
т.е.
Код:

ShowMessage('count = '+IntToStr( TransferPowerForm.TransferList.Items.Count));

покажет count = 0 ?

тогда попробуйте:
Код:

     for I := 0 to TransferPowerForm.TransferList.Items.Count-1 do ShowMessage('i = '+IntToStr(i));

вставил до цикла
ShowMessage('count = '+IntToStr( TransferPowerForm.TransferList.Item s.Count));
и ...do ShowMessage('i = '+IntToStr(i));
результат: count = 0


Если заполнить listview, вызывается ShowMessage
count = 1, count = 2
тоесть цикл. работает...
но после него нечего не выполняется... как будто делфи глючит..
Вопрос: Описание массива после ввода значения!

Доброго времени суток!Сложились некоторые вопросы по описанию переменных и массивов...

Вот допустим,
Описали переменную А
ввели А

Как описать одномерный массив после этого от 1 до А???
Вылетает ошибка, что ожидалась константа.
Я пробовал ввести константу равную А, но потом мне вылетало что (Ожидался оператор).

Когда и как можно описывать переменные, константы и массивы в Pascal Abc Net??
Напишите пожалуйста исчерпывающую и доступную для понимания информацию. Прочесал тырнет , но ничего толкового не нашел!!
Ответ:
Сообщение от Кудинович
То мы выделяем память массиву?
Мы выделим память под массив размером в n элементов.
Сообщение от Кудинович
зачем писать Randomize?
Затем что бы при каждом запуске выводило разный набор чисел, иначе все время будет выводить одно и то же.
Сообщение от Кудинович
чтобы массив начинался не с нуля, а с единицы?
Тогда нужно в разделе var предусматривать максимальный размер массива
Pascal
1
2
3
4
5
var a:array[1..100] of integer;//вместо 10 можно другое натуральное число.
..............................
readln(n);
for i:=1 to n do
..............
Вопрос: Вставить значение минимального элемента массива после всех четных элементов

Дан массив целых чисел из n элементов, заполненный случайным образом числами из промежутка [-50,50]. Вставить значение минимального элемента массива после всех четных элементов.
Ответ: Т.е., к примеру, такой массив

[-4,20,46,-17,-5,1,22,-41,9,4,37,-15]

должен быть преобразован в такой?

[-4,20,46,-17,-5,1,22,9,4,-41,37,-15]

А, к примеру, такой массив должен быть как-то преобразован?

[-4,20,46,-17,-5,1,22,-41,9,3,37,-15]

Числа в массиве могут повторяться? Если да, то нужно ли преобразовывать, к примеру, такой массив?

[-4,20,-41,-17,-5,1,22,-41,9,4,37,-15]
Вопрос: Определение массива после работы функции - упростить код

Надо переписать вот эту сроку проще. И без ++.
C
1
 for( ; ++c != b; ) *c = (*f)(*(c - 1));
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
#include <stdio.h>
#define N 5
 
int succ (int x)
{
return ++x;
}
 
int mply2 (int x)
{
return x*=2;
}
 
void iterateN (int *a, int n, int val, int (*f) (int x))
{
  
  int *b = a + n;
  int *c = a;
  *c = val;
  for( ; ++c != b; ) *c = (*f)(*(c - 1));
}
 
int main ( void )
{
  
  int d[N];
  iterateN(d, N, 2, succ);
  int i;
  printf("Значения массива после вызова функ. iterateN с одним из аргументов succ:\n");
  for(i = 0; i < N; i++)printf("%d ", d[i]);
  iterateN(d, N, 2, mply2);
  printf("\nЗначения массива после вызова функ. iterateN с одним из аргументов mply2:\n");
  for(i = 0; i < N; i++)printf("%d ", d[i]);
  return 0;
}
Ответ: Swifts422,

Не по теме:

масло масляное. передавая массив, ты передаёшь указатель на первый его элемент.

Вопрос: После цикла for не сохраняется значение

Есть задача:
Пользователь вводит в массив из десяти элементов любые числа (заполняет массив). Нужно показать ему суму всех чисел от первого отрицательного числа до последнего. Пример:
Числа в массиве:
1
2
1
23
-4
3
4
-1
9
1
Сума равна 3+4=7. Число 3 и 4 находятся между первым отрицательным (-4) и последним (-1).
Вот мой код:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
int massTHREE[10];
for (int i = 0; i <= 9; i++)
    {
        cin >> massTHREE[i];
        }
int first, last, sum1;
    for (first = 0; first < 10; first++)
    {
        if (massTHREE[first] < 0) break;
    }
    for (last = 9; last > first; last--)
    {
        if (massTHREE[last] < 0) break;
    }
    for (int i = first + 1; i < last; i++)
    {
        sum1 += massTHREE[i];
    }
Проблема в том, что в первом цикле for (где ищем first), переменная first не сохраняется, хотя я ее инициализировал до цикла. С переменной last все хорошо. Где ошибка, если циклы почти идентичны?
Ответ:
Сообщение от BuLL96
Какая разница, какое оно до цикла, если после цикла оно должно меняться?
Вы ваше условие выхода из цикла видели? Как вам кажется, изменится ли значение, если вы вывалились на самой первой итерации, когда индекс 0? Короче, включайте отладчик и ищите косяк.
Вопрос: Сформировать массив Z, объединив массивы X и Y (без повторяющихся элементов)

Заданы два массива X=(x1,x2,...,xn) и Y = (y1,y2,...,ym), в состав которых входят натуральные числа, причем в каждом из этих массивов нет повторяющихся элементов. Сформировать массив Z, объединив массивы X и Y; при этом в массиве Z также не должно быть повторяющихся элементов.
Ответ: Огромное Спасибо!
Вопрос: Объединить массивы A и B в третий массив C

заданы 2 массива A от N и B от N, элементы которых упорядочены по возрастанию, объединить массивы A и B в третий массив C !
Ответ:
Вопрос: очищается ли память массива после выхода из цикла или при переходе на следующий шаг цикла?

Объявляю массив в цикле, что будет происходить при каждом шаге? Очистится ли уже ненужный и создастся новый буфер ? Не будет ли утечки? Здесь бывают случаи когда буфер может быть не полностью забит, а только какая та его часть.
for(int i=0;i<n;i++){
  char buf[MAX_BUF_SIZE];
  recv(sock[i], buf, MAX_BUF_SIZE, 0);
  add_to_ar(ar[i],buf); // этой функции нет. просто показать что с буфером что то выполняется
}
Ответ:
Картежник
как узнать когда клиент отключился?

может все-таки послушать советы
Dimitry Sibiryakov
Думать вредно. Читай доку.

и начать читать как ошибки обрабатывать?
https://www.google.ru/search?q=recv()
https://msdn.microsoft.com/en-us/library/windows/desktop/ms740121(v=vs.85).aspx
http://www.opennet.ru/man.shtml?topic=recv&category=2&russian=0
Вопрос: Как наиболее рационально обратиться к элементам динамического массива через цикл For

Здравствуйте, подскажите пожалуйста, как наиболее рационально обратиться к элементам динамического массива через цикл For? Есть вот такой вариант:
Pascal
1
2
3
4
endFor:= Length(myArray)-1;
For i:=0 to endFor do
begin
end;
И не подскажите, как преобразовать динамический массив char в строковую переменную?
Заранее спасибо.
Ответ: rangerx, спасибо большое.