Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Задача (на Intel 8080), Нужна помощь в написании программы 
:(
    Опции темы
Yanis
Дата 21.3.2005, 20:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2937
Регистрация: 9.2.2004
Где: Москва

Репутация: нет
Всего: 111



Помогите мне написать программу сортирущую 15 2х байтовых чисел и нахадящую их ср. арифметическое. Может кто что подскажет?


--------------------
user posted image *щёлк*
PM MAIL WWW ICQ   Вверх
Chingachguk
Дата 21.3.2005, 20:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1232
Регистрация: 25.3.2002
Где: Москва

Репутация: нет
Всего: 18



Ты про тот проц, где есть команды типа LDA, STA ... ?

Счас попробую - ?

PS Короче, я на ассемблере 8080 не писал, у меня есть книжка "Программирование на языке ассемблера для микропроцессоров 8080 и 8085 Левенталя и Сэйвилла", по ней я тебе завтра могу что-то изобразить, в ней есть даже пример сортировки, но для тебя он больно сложен - там медианный метод.

Это сообщение отредактировал(а) Chingachguk - 21.3.2005, 20:44


--------------------
I don't like the drugs (but the drugs like me). M.Manson.
PM MAIL ICQ   Вверх
Yanis
Дата 23.3.2005, 10:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2937
Регистрация: 9.2.2004
Где: Москва

Репутация: нет
Всего: 111



Ну там, типа ADI, MVI, LXI и тд.

Цитата(Chingachguk @ 21.3.2005, 20:33)
...там медианный метод.

Дамаю, что "пузырьком" будет попроще smile


--------------------
user posted image *щёлк*
PM MAIL WWW ICQ   Вверх
Yanis
Дата 24.3.2005, 20:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2937
Регистрация: 9.2.2004
Где: Москва

Репутация: нет
Всего: 111



Буду очень благодарен за любую помощь. К стати, по моему, есть только один хороший эмультор i8080 (K580BM80). По крайней мере лучше чем этот я не знаю. Если нужен могу выложить на народе.


--------------------
user posted image *щёлк*
PM MAIL WWW ICQ   Вверх
Chingachguk
Дата 25.3.2005, 10:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1232
Регистрация: 25.3.2002
Где: Москва

Репутация: нет
Всего: 18



А какая помощь тебе нужна-то ?


--------------------
I don't like the drugs (but the drugs like me). M.Manson.
PM MAIL ICQ   Вверх
Yanis
Дата 25.3.2005, 14:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2937
Регистрация: 9.2.2004
Где: Москва

Репутация: нет
Всего: 111



Цитата(Chingachguk @ 25.3.2005, 10:25)
А какая помощь тебе нужна-то ?

Не знаю как сделать сортировку. Сейчас сижу разбираюсь с похожим примером, но как то медленно всё доходит smile Могу опубликовать.


--------------------
user posted image *щёлк*
PM MAIL WWW ICQ   Вверх
Chingachguk
Дата 28.3.2005, 11:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1232
Регистрация: 25.3.2002
Где: Москва

Репутация: нет
Всего: 18



Публикуй, посмотрю.


--------------------
I don't like the drugs (but the drugs like me). M.Manson.
PM MAIL ICQ   Вверх
Yanis
Дата 28.3.2005, 19:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2937
Регистрация: 9.2.2004
Где: Москва

Репутация: нет
Всего: 111



Вот. Вобщем это, вроде курсовая работа. Мне по ней надо сделать свою задачу.

0A00-0A1С Заданный массив
0A60-0A62 Сумма
0A90-0A92 Среднее арифметическое (ответ)
0A8F Остаток

Код

mvi b, 00
mvi c, 00
mvi d, 00

; (e) - длина массива
mvi e, 0E

; (M) - 1й элемент массива
mvi h, 0A
mvi l, 00
mov d, e

; судя по всему в l заносится
; адрес где будет храниться сумма
mvi l, 60

; (0A60) = 0
mvi m, 00
inr l

; (0A61) = 0
mvi m, 00
inr l

; (0A62) = 0
mvi m, 00

l1:
call sum
mov a, e
ani FF
    jnz l1 ; if (z = 0) jump l1
    mvi l, 8F
    mvi m, 00
    inr l
    mvi m, 00
    inr l
    mvi m, 00
    inr l
    mvi m, 00
    mvi l, 62
    mov a, m
    ani 80
    cz div_poz ; if (z = 1) jump div_poz
    mvi l, 62
    mov a, m
    ani 80
    cnz div_neg ; if (z = 1) jump div_neg

end:
    rst1

sum:
    dcr e ; e = e - 1
    mov l, b
    inr l ; l = l + 1
    mov a, m
    ani 80 ; лог. оп. «И» со 2 байтом
    jnz neg ; if (z = 0) jump neg
    mvi l, 60
    mov a, m
    mov l, b
    add m
    mvi l, 60
    mov m, a
    mvi l, 61
    mov a, m
    mov l, b
    inr l
    adc m ; сложение с переносом
    mvi l, 61
    mov m, a
    mvi l, 62
    mov a, m
    aci 00 ; слож. со вторым байтом и переносом
    mov m, a
    inr b
    inr b
    ret

neg:
    mov l, b
    mov a, m
    cma ; A = !A
    adi 01
    mov m, a
    inr l
    mov a, m
    cma
    aci 00
    mov m, a
    mvi l, 60
    mov a, m
    mov l, b
    sub m
    mvi l, 60
    mov m, a
    mvi l, 61
    mov a, m
    mov l, b
    inr l
    sbb m
    mvi l, 61
    mov m, a
    mvi l, 62
    mov a, m
    sbi 00
    mov m, a
    inr b
    inr b
    ret

div_poz:
    mvi l, 62
    mov a, m
    ani 80
    mov a, m
    jnz big
    cmp d
    cm div_poz_sred

big:
    mvi l, 62
    mov a, m
    sub d
    mov m, a
    mvi l, 92
    mov a, m
    adi 01
    mov m, a
    jmp div_poz

div_poz_sred:
    mvi l, 61
    mov a, m
    ani 80
    mov a, m
    jnz big_1
    cmp d
    cm zero_sred_1

big_1:
    mvi l, 61
    mov a, m
    sub d
    mov m, a
    mvi l, 62
    mov a, m
    sbi 00
    mov m, a
    mvi l, 91
    mov a, m
    adi 01
    mov m, a
    mvi l, 92
    mov a, m
    aci 00
    mov m, a
    jmp div_poz_sred

zero_sred_1:
    mvi l, 62
    mov a, m
    ani ff
    jz div_poz_mlad
    ret

div_poz_mlad:
    mvi l, 60
    mov a, m
    ani 80
    mov a, m
    jnz big_2
    cmp d
    cm zero_mlad_1

big_2:
    mvi l, 60
    mov a, m
    sub d
    mov m, a
    mvi l, 61
    mov a, m
    sbi 00
    mov m, a
    mvi l, 62
    mov a, m
    sbi 00
    mov m, a
    mvi l, 90
    mov a, m
    adi 01
    mov m, a
    mvi l, 91
    mov a, m
    aci 00
    mov m, a
    mvi l, 92
    mov a, m
    aci 00
    mov m, a
    jmp div_poz_mlad

zero_mlad_1:
    mvi l, 61
    mov a, m
    ani ff
    jz zero_mlad_2
    ret

zero_mlad_2:
    mvi l, 62
    mov a, m
    ani ff
    jz end_1
    ret

end_1:
    mvi l, 60
    mov a, m
    mvi l, 8F
    mov m, a
    mov a, e
    ani ff
    jnz invert
    jmp end

div_neg:
    mvi e, ff
    mvi l, 60
    mov a, m
    cma
    adi 01
    mov m, a
    inr l
    mov a, m
    cma
    aci 00
    mov m, a
    inr l
    mov a, m
    cma
    aci 00
    mov m, a
    call div_poz

invert:
    mvi l, 8F
    mov a, m
    cma
    adi 01
    mov m, a
    inr l
    mov a, m
    cma
    adi 01
    mov m, a
    inr l
    mov a, m
    cma
    aci 00
    mov m, a
    inr l
    mov a, m
    cma
    aci 00
    mov m, a
    jmp end



--------------------
user posted image *щёлк*
PM MAIL WWW ICQ   Вверх
Chingachguk
Дата 30.3.2005, 11:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1232
Регистрация: 25.3.2002
Где: Москва

Репутация: нет
Всего: 18



И ты хочешь на основании этого сделать сортировку ?... Позже посмотрю подробнее.


--------------------
I don't like the drugs (but the drugs like me). M.Manson.
PM MAIL ICQ   Вверх
Yanis
Дата 31.3.2005, 11:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2937
Регистрация: 9.2.2004
Где: Москва

Репутация: нет
Всего: 111



Цитата(Chingachguk @ 30.3.2005, 11:43)
И ты хочешь на основании этого сделать сортировку ?

Не обязательно на основании этого, мне главное понять как её реализовать!
Цитата(Chingachguk @ 30.3.2005, 11:43)
Позже посмотрю подробнее.

Буду признателен!


--------------------
user posted image *щёлк*
PM MAIL WWW ICQ   Вверх
Chingachguk
Дата 31.3.2005, 23:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1232
Регистрация: 25.3.2002
Где: Москва

Репутация: нет
Всего: 18



Цитата
Не обязательно на основании этого, мне главное понять как её реализовать!


Ну, мне кажется лучше сделать так: сначала напиши по-возможности простой алгоритм - тот же пузырек - на ассемблере 8086, а если не знаешь его - на Паскале или СИ. Отладь ее получше, затем один в один перебей на 8080, если будут проблемы с этим, я попробую помочь.

Вот совсем простой варинт пузырька, даже без анализа уже отсортированного массива во внешнем цикле:

Код

Sort_Bubble PROC NEAR
   push bp
   mov  bp,sp
   mov  cx,[bp+4] ; Len of massive
   dec  cx
   jz   @@SortBubbleDone
@@SortBubble:
   push cx
   mov  si,[bp+6] ; Address of massive
@@OneStep:
   mov  ax,[si]
   cmp  word ptr [si+2],ax
   jae  @@NextElemNoLow
   xchg [si+2],ax
   mov  [si],ax
@@NextElemNoLow:
   inc  si
   inc  si
   loop @@OneStep
   pop  cx
   loop @@SortBubble
@@SortBubbleDone:
   pop  bp
   RET  2*2
Sort_Bubble ENDP


Это сообщение отредактировал(а) Chingachguk - 31.3.2005, 23:09


--------------------
I don't like the drugs (but the drugs like me). M.Manson.
PM MAIL ICQ   Вверх
Yanis
Дата 1.4.2005, 14:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2937
Регистрация: 9.2.2004
Где: Москва

Репутация: нет
Всего: 111



Цитата(Chingachguk @ 31.3.2005, 23:08)
Ну, мне кажется лучше сделать так: сначала напиши по-возможности простой алгоритм - тот же пузырек - на ассемблере 8086, а если не знаешь его - на Паскале или СИ. Отладь ее получше, затем один в один перебей на 8080, если будут проблемы с этим, я попробую помочь.

Сегодня с утра так и сделал: набрал на Delphi код "пузырька" и посмотрел код в Debug'е. Тольок там не совсем понятно и наглядно. К тому же на x80 and x85 мало регистров. Всего то 5+2 регистров: A, B, C, E, D, M(H, L). Да плюс к этому нет инструкции loop.

Цитата(Chingachguk @ 31.3.2005, 23:08)
Вот совсем простой варинт пузырька, даже без анализа уже отсортированного массива во внешнем цикле:

Спасибо за код как домой попаду начну разбираться. А этот код будет в Delphi работать? Хотя у меня дома ещё MASM32 есть, но там потрейсить не получится.


--------------------
user posted image *щёлк*
PM MAIL WWW ICQ   Вверх
Chingachguk
Дата 1.4.2005, 14:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1232
Регистрация: 25.3.2002
Где: Москва

Репутация: нет
Всего: 18



Цитата
А этот код будет в Delphi работать?


Напрямую не будет, он рассчитан на 16-ти битный режим. Нужно переделать si->esi, cx->ecx, esi загрузить верно... Примерно так:

Код

{ Сортировка массива вордов (16 бит) }
Procedure Sort_Bubble(var Massive: array of word; Len: integer)
  begin
   asm
   mov  ecx,Len ; Len of massive
   dec  ecx
   jz   @@SortBubbleDone
@@SortBubble:
   push ecx
   mov  esi,Massive ; Address of massive
@@OneStep:
   mov  ax,[esi]
   cmp  word ptr [esi+2],ax
   jae  @@NextElemNoLow
   xchg [esi+2],ax
   mov  [esi],ax
@@NextElemNoLow:
   inc  esi
   inc  esi
   loop @@OneStep
   pop  ecx
   loop @@SortBubble
@@SortBubbleDone:
  end;
  end;


Цитата
но там потрейсить не получится


Ну почему это ? Компилируешь в *.com, *.exe или еще что и смотри в td.exe (для дос). Можно набить это в асм-вставке в turbo pascal 7.0 для ДОС - там отлично трейсится асм-код и регистры тоже.

Цитата
Да плюс к этому нет инструкции loop.


Используй комбинацию dec reg(cx, ecx...) + jnz @@Label.


--------------------
I don't like the drugs (but the drugs like me). M.Manson.
PM MAIL ICQ   Вверх
Yanis
Дата 5.4.2005, 18:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2937
Регистрация: 9.2.2004
Где: Москва

Репутация: нет
Всего: 111



В принципе, я разобрался с вашим кодом сортировки массива слов (см. .04.2005). Ещё переделал этот код на сортировку массива байт. Вот, что получилось (не могу без коментариев. Всё в голове не умещается smile).

Код

  asm
      mov  ecx, Len                { Len of array }
      dec  ecx                         { ecx-- }
      jz   @@SortBubbleDone { if (ZF == 1) jump @@SortBubbleDone }

    @@SortBubble:
      push ecx                        { Push Word onto Stack }
      mov  esi, Massive          { Address (beginning) of array }

    @@OneStep:
      mov  AL, [esi]                { Current element of a array}
      cmp  BYTE PTR [esi + 1], AL { Compare [current element + 1] with [current element] }
      jae  @@NextElemNoLow        { Jump (if above or equal) @@NextElemNoLow }
      xchg [esi+1], AL            { Exchange [current element + 1] with [current element] }
      mov  [esi], AL              { ??? }

    @@NextElemNoLow:
      inc  esi                    { esi++ }
      // inc  esi
      loop @@OneStep              { ecx--; if (ecx != 0) jump @@OneStep }
      pop  ecx                    { In ecx from stack top}
      loop @@SortBubble           { ecx--; if (ecx != 0) jump @@SortBubble }

    @@SortBubbleDone:
  end;


Всё правильно???


Наверное решать эту задачу (см. ) сразу на ассемблере i80 процессора будет сложновато. Поэтому я перефразирую вопрос. Может так будет легче перенести программу на ассемблер.

Задача (общий вид). Дан массив A из n элементов типа Byte (A: array[1..n] of Byte). Каждая пара чисел/элементов массива (A[1], A[2]), (A[3], A[4])...(A[n-1], A[n]) представляет (принимается за) слово (WORD). Произвести сортировку этих слов.

У меня на delphi получился такой код:

Код

{ ######################## }
{ #### Bubble Sorting #### }
{ ######################## }

  for i := 1 to 15 do
    for j := 1 to 15 - 1 do

// Check of high byte
      if (A[2 * j - 1] > A[2 * j + 1]) then
        begin
          // Low byte swap
          temp := A[2 * j];
          A[2 * j] := A[2 * j + 2];
          A[2 * j + 2] := temp;

          // Hi byte swap
          temp := A[2 * j - 1];
          A[2 * j - 1] := A[2 * j + 1];
          A[2 * j + 1] := temp;
        end
      else

// Check of low byte
        if (A[2 * j - 1] = A[2 * j + 1]) then
          if (A[2 * j] > A[2 * j + 2]) then
            begin
              // Low byte swap
              temp := A[2 * j];
              A[2 * j] := A[2 * j + 2];
              A[2 * j + 2] := temp;
            end;

{ ################# }


Но мне теперь нужно перегнать этот код в ассемблер smile Буду пробовать, но для меня это сложновато...


--------------------
user posted image *щёлк*
PM MAIL WWW ICQ   Вверх
Chingachguk
Дата 5.4.2005, 21:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1232
Регистрация: 25.3.2002
Где: Москва

Репутация: нет
Всего: 18



Цитата
Вот, что получилось (не могу без коментариев. Всё в голове не умещается ).


Комментарии - это здорово, и не совсем потому, что будет проще (не только тебе) впоследствии понять, в чем дело было. А потому, что написав мысль делаешь ее ясной для себя ;) Я обычно так и пишу:

Код

; Инициализируем массив данных WorkArea, в котором будет хранится информация
; о состоянии программ - заражена / нет
; Определим размер массива
; В одной корневой директории логического диска содержится директорий:
;   LocDirs ^ ( DirsLevel + 1 ) - 1
; ( ------------------------------- ) = DirsPerRootDir
;            LocDirs - 1
; ( Включая директорию корня - плюс 1)
;
        mov  cx,DirsLevel       ; cx = DirsLevel - уровень вложенности
        mov  ax,LocDirs         ; ax = LocDirs - количество директорий
        mov  bx,LocDirs         ; bx = LocDirs - количество директорий
@GetPower:                      ; Возведем в степень
        mul  bx
        loop @GetPower
        dec  ax                 ; ax = LocDirs ^ ( DirsLevel + 1 ) - 1
        dec  bx                 ; bx = LocDirs - 1
        xor  dx,dx
        div  bx                 ; ax = всего директорий в корневой директории,
        mov  DirsPerRootDir,ax  ; включая ее саму
        mov  bx,ExecutableProgs ; bx = Число выполняемых программ в директории
        mul  bx                 ; ax = Число программ в корневом каталоге
        mov  bx,DirsPerDrive    ; bx = Число корневых директорий на диске
        mul  bx                 ; ax = Число программ на 1 диске
        mov  bx,DriveNumber     ; bx = Число логических дисков
        mul  bx                 ; ax = Число программ на всех дисках
        mov  TotalPrograms,ax   ; Запомним число всех программ на всех дисках


Цитата
Всё правильно???


Да, все верно, ты превратил это в сортировку массива байт. А вообще опыт - лучший критерий правильности.

Код

xchg [esi+1], AL  { Exchange [current element + 1] with [current element] }
mov  [esi], AL      { ??? }


Ну это и есть обмен элементов [esi+1] <-> [esi]:

Код

char *esi, AL;
...
mov  AL, [esi]   // AL= *esi; // Current element of a array
cmp  BYTE PTR [esi + 1], AL // if ( *(esi+1) >= AL ) goto @@NextElemNoLow;
jae  @@NextElemNoLow
xchg [esi+1], AL  // char tmp=*(esi+1), *(esi+1)= AL, AL= tmp;
mov  [esi], AL // *(esi)= AL;


Цитата
Задача (общий вид). Дан массив A из n элементов типа Byte (A: array[1..n] of Byte). Каждая пара чисел/элементов массива (A[1], A[2]), (A[3], A[4])...(A[n-1], A[n]) представляет (принимается за) слово (WORD). Произвести сортировку этих слов.


Я не очень понял, чем эта задача отличается от сортировки слов (16 бит). Если мы будем представлять элементы Aj,Aj+1 как слово (Aj+1=high byte, Aj-low byte), и отсортируем их именно как слова, то будет ли решена задача ? Или приведи пример из набора чисел, и как они должны выглядеть после сортировки. И еще я сомневаюсь, что код на Паскале написан без ошибки ;) Его надо проверить.



--------------------
I don't like the drugs (but the drugs like me). M.Manson.
PM MAIL ICQ   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Asm: Общие вопросы"
MAKCim
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • Не забывайте пользоваться кнопкой КОД.
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к разделу форума. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, MAKCim.

 
 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Asm: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0943 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.