Помогите с прожкой на i8080 (в чем ошибка)

Тема в разделе "WASM.ELECTRONICS", создана пользователем merk, 7 апр 2007.

  1. merk

    merk New Member

    Публикаций:
    0
    Регистрация:
    25 мар 2007
    Сообщения:
    18
    Есть 2 восьмиразрядных числа со знаком и нужно составить программу умножения этих чисел начиная со старшего разряда множителя со сдвигом сумм частных произведений влево.
    Вот как выглядит (как мне кажется):
    Скажем на примере 2 чисел: 88 и 08 (т.е. -8 и 8 в х10)
    Код (Text):
    1.         LDA 804FH   // 88 -> А
    2.         ANI 7FH     // 88 -> 08
    3.         MOV E,A     // 08 -> E
    4.                
    5.         LDA 8050H   // 08 -> А
    6.         ANI 7FH     // 08
    7.                
    8.         MVI D, 00H  // 00 -> D
    9.                
    10.         LXI H,0000H // H -> 00, L -> 00
    11.                
    12.                
    13.         MVI B,08H  // B -> 8
    14.                
    15. M0:       DAD H         \
    16.           RLC            \
    17.           JNC M1          \
    18.                            > тут мы умножаем 08 на 08 и получаем 40
    19.           DAD D           /
    20. M1:       DCR B          /
    21.           JNZ M0        /
    22.        
    23.         LDA 804FH   // 88 -> А
    24.         MOV E,A     // 88 -> E
    25.         LDA 8050H   // A -> 08
    26.         XRA E       // Исключающее ИЛИ -> 1000'1000 и 0000'1000 =>
    27.                        1000'0000
    28.         ANI 80H     // логическое И, чтобы выделить только знаковый
    29.         разряд: 1000'0000 и 1000'0000 => 1000'0000
    30.         ORA H       // Логическое ИЛИ тут у нас в старшем байте
    31.         0000'0000 и 1000'0000 => должно получиться 1000'0000.
    32.         STA 8051H // запихиваем в 8051
    33.  
    34.         MOV A,L //грузим младший
    35.         STA 8052H  // запихиваем в 8052
    36.  
    37.         HLT  //конец
    Может кто подскажет где ошибка - почему знак не определяется в конце =/ Я уже отчаялся понять
     
  2. twgt

    twgt New Member

    Публикаций:
    0
    Регистрация:
    15 янв 2007
    Сообщения:
    1.494
    Первый раз такой вижу, но по моему ошибка в ora H
     
  3. merk

    merk New Member

    Публикаций:
    0
    Регистрация:
    25 мар 2007
    Сообщения:
    18
    Гм, в чем именно?
    Табличка ж или такая, разве нет?
    А В F
    ------------
    0 0 0
    0 1 1
    1 0 1
    1 1 1
     
  4. twgt

    twgt New Member

    Публикаций:
    0
    Регистрация:
    15 янв 2007
    Сообщения:
    1.494
    Та с операндом все нормально, я не знаю даже спецификацию этого проца :)
    я думал что H и L это части 16-разрядного регистра A , но видимо я ошибаюсь
     
  5. rmn

    rmn Well-Known Member

    Публикаций:
    0
    Регистрация:
    23 ноя 2004
    Сообщения:
    2.347
    вместо ORA H надо поксорить пару H,L c FFFFh и прибавить единицу (но только если знаковый бит установлен).
     
  6. merk

    merk New Member

    Публикаций:
    0
    Регистрация:
    25 мар 2007
    Сообщения:
    18
    Мммм, оно тогда всегда ж будет показывать FF в старшем? Разве нет? Да кстати - результат в этом примере 88*08=8040? Я ничего не путаю?
     
  7. twgt

    twgt New Member

    Публикаций:
    0
    Регистрация:
    15 янв 2007
    Сообщения:
    1.494
    должно быть FFC0, так говорит виндовый калькулятор.
    Получается это так как написал rmn
    08*08=40 xor FFFF =FFBF + 1=FFC0
    А (NOT FFC0)+1=40
    ;)
    И чем я почувствовал что ошибка в ora h :)
     
  8. merk

    merk New Member

    Публикаций:
    0
    Регистрация:
    25 мар 2007
    Сообщения:
    18
    Гм, виндовый калькулятор не так считает =/ 88*08 это произведение -8 на 8, первая восьмерка - это чисто знак, т.к. отрицательные умножать проц не умеет, то мы умножаем 2 положительных и выставляем знак в старший разряд - так мне объяснили, а 8*8=40 в х16 и 80 - старший знак (-).

    И чет я все равно не понимаю что ксорить х_х, H? L? Оба? И увеличивать на 1 оба?
    Если все-тки так как вы говорите - можно вместо xor FFFFh юзать xor 11111111b ? Проц не знает FF почему-то =)
    И еще - что значит А (NOT FFC0)+1=40 ?
     
  9. twgt

    twgt New Member

    Публикаций:
    0
    Регистрация:
    15 янв 2007
    Сообщения:
    1.494
    Ну незнаю, я умножал именно -8 на 8, и xor имел ввиду именно из калькулятора:), то есть по вашему это xra.
    А (not x)+1 это замена команды neg из набора 386.
    Я просто показал что если умножить FFC0 на -1 то получается как раз 40.
    Хотя я немного сомневаюсь в своей правоте:), этот проц мне все таки не знаком сильно
     
  10. rmn

    rmn Well-Known Member

    Публикаций:
    0
    Регистрация:
    23 ноя 2004
    Сообщения:
    2.347
    merk
    Чтобы поменять знак числа, недостаточно выставить (сбросить) старший бит.

    Например, есть два 16-ти разрядных числа A и B, причем B == -A.
    Значит должно выполняться условие:
    A + B = 0
    следовательно, B = 0 - A или B = (FFFFh + 1) - A или FFFFh - A + 1

    В x86 для этой операции есть инструкция NEG. В i8080 ее не увидел (может мануал такой :)),
    так что ее можно заменить на
    NOT A
    INC A

    NOT тоже у этого проца не нашел, так что меняем его на
    XOR A, FFFFh

    Да, оба.
    напр.
    Код (Text):
    1. mov a, h
    2. xri 0ffh
    3. mov h, a
    4. mov a, l
    5. xri 0ffh
    6. mov l, a
    7. inx h
    знает, только 0 надо добавлять, если hex-число начинается с A..F
     
  11. merk

    merk New Member

    Публикаций:
    0
    Регистрация:
    25 мар 2007
    Сообщения:
    18
    Вы меня запутали -_- у меня в прожке надо опрделение и изменение знака, а вы мне рассказали как его изменить.. Теперь получился кусок оторванный от кода :) Ну да, он стал считать 88*08=FF0C, и больше ничего не умеющий)
     
  12. rmn

    rmn Well-Known Member

    Публикаций:
    0
    Регистрация:
    23 ноя 2004
    Сообщения:
    2.347
    Код (Text):
    1.     LDA 804FH
    2.     ANI 7FH
    3.     MOV E, A
    4.     LDA 8050H
    5.     ANI 7FH
    6.     MVI D, 00H
    7.     LXI H, 0000H
    8.     MVI B, 08H
    9.                
    10. M0:
    11.     DAD H
    12.     RLC
    13.     JNC M1
    14.     DAD D
    15.    
    16. M1:
    17.     DCR B
    18.     JNZ M0
    19.    
    20.     LDA 804FH
    21.     MOV E, A
    22.     LDA 8050H
    23.     XRA E       // не знаю, устанавливает ли XRA флаг знака.
    24.             // Если нет, нужен другой вариант проверки
    25.     JP  M3      // jump if S == 0
    26.  
    27.     MOV A, H
    28.     XRI 0ffh
    29.     MOV H, A
    30.     MOV A, L
    31.     XRI 0ffh
    32.     MOV L, A
    33.     INX H
    34.  
    35. M3:
    36.     MOV A, H
    37.     STA 8051H
    38.    
    39.     MOV A, L
    40.     STA 8052H
    41.    
    42.     HLT
     
  13. twgt

    twgt New Member

    Публикаций:
    0
    Регистрация:
    15 янв 2007
    Сообщения:
    1.494
    Покажи результаты
    для каких либо еще
    чисел

    зы, надо сделать что
    то типа

    lda 804fh

    xra 8050h

    rlc

    jnc
    не_менять_знак_на
    _положительный

    шо то клонируятся сообщения:/
     
  14. merk

    merk New Member

    Публикаций:
    0
    Регистрация:
    25 мар 2007
    Сообщения:
    18
    XRA не устанавливает, но можно обновить знаки ANA A к примеру, сейчас попробую..
    Чет не выходит :) 88 xor 08 не получается отрицательного.. а вот 88 xor 88 получается... я дерево? оО
     
  15. twgt

    twgt New Member

    Публикаций:
    0
    Регистрация:
    15 янв 2007
    Сообщения:
    1.494
    Покажи финальный исходник, хотя там получается нужно логику джампа при проверке на знак поменять на противоположную
     
  16. merk

    merk New Member

    Публикаций:
    0
    Регистрация:
    25 мар 2007
    Сообщения:
    18
    Код (Text):
    1.             LDA 804FH  
    2.                
    3.                
    4.             ANI 7FH
    5.                
    6.             MOV E,A
    7.             LDA 8050H  
    8.                
    9.                
    10.             ANI 7FH
    11.                
    12.             MVI D, 00H 
    13.                
    14.             LXI H,0000H
    15.                
    16.                
    17.             MVI B,08H  
    18.                
    19.         M0: DAD H  
    20.             RLC
    21.             JNC M1 
    22.                
    23.                
    24.             DAD D  
    25.         M1: DCR B  
    26.             JNZ M0 
    27.        
    28.                 LDA 8050H
    29.             MOV E,a
    30.             lda 804fh  
    31.                
    32.                
    33.             XRA E  
    34.             RLC
    35.             JNC m3
    36.  
    37.             MOV A, H
    38.             XRI 0ffh
    39.             MOV H, A
    40.             MOV A, L
    41.             XRI 0ffh
    42.             MOV L, A
    43.             INX H
    44.             MOV A, H
    45.             STA 8051H
    46.  
    47.             MOV A, L
    48.             STA 8052H
    49.  
    50.             HLT
    51.  
    52.            M3:
    53.             MOV A, H
    54.             STA 8051H
    55.  
    56.             MOV A, L
    57.             STA 8052H
    58.  
    59.             HLT
     
  17. rmn

    rmn Well-Known Member

    Публикаций:
    0
    Регистрация:
    23 ноя 2004
    Сообщения:
    2.347
    Кстати, 88h это не -8, а -120. -8 будет - 0F8h. Ну это так, к слову... :)

    т.е. что, здесь не получилось 80h?
    Ты же сам говоришь, что XRA не устанавливает флаг S.
    Сделал ANA A?
    или можешь после XRA E поставить
    RLC
    JNC M3
    вместо JP M3
    как twgt говорит...
     
  18. merk

    merk New Member

    Публикаций:
    0
    Регистрация:
    25 мар 2007
    Сообщения:
    18
    К слову мне преп втирал, что 1 бит для человека =) Типа 1000'1000 - это минус 8 =)
    О том и речь 88*08=0040, 88*88=FF0C после XRA E так и стоит кстати) ANA A если брать переходи по плюсу/минусу делал, то же самое :) И "обратная логика" jc/jnc тож не дает эффекта.. получается что 88*08, что 88*88. Одинаковый ответ ((( ппц.. простая задачка, а нифига не выходит
     
  19. twgt

    twgt New Member

    Публикаций:
    0
    Регистрация:
    15 янв 2007
    Сообщения:
    1.494
    Перед xra e попробуй поставить очистку флага C
    добавленно: А потом попробуй наоборот, установку этого флага влепить
     
  20. merk

    merk New Member

    Публикаций:
    0
    Регистрация:
    25 мар 2007
    Сообщения:
    18
    [дубль]