User Tag List

Страница 29 из 35 ПерваяПервая ... 252627282930313233 ... ПоследняяПоследняя
Показано с 281 по 290 из 342

Тема: Программирование на ассемблере

  1. #281

    Регистрация
    07.08.2008
    Адрес
    г. Уфа
    Сообщений
    8,386
    Спасибо Благодарностей отдано 
    763
    Спасибо Благодарностей получено 
    2,365
    Поблагодарили
    1,315 сообщений
    Mentioned
    38 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Если отвлечься от требований, которые мне были нужны для конкретной программы, то процедуру можно разлочить до 8=24/16. Убираем XRA A в начале и MOV A,L в конце и вуаля:
    ;L=AHL/DE
    ;AH=AHL%DE
    Правда если нужна проверка делителя на ноль в начале, то она в таком случае усложняется
    Код:
    		inr e\ dcr e\ jnz $+6
    		inr d\ dcr d\ rz

  2. #282

    Регистрация
    07.08.2008
    Адрес
    г. Уфа
    Сообщений
    8,386
    Спасибо Благодарностей отдано 
    763
    Спасибо Благодарностей получено 
    2,365
    Поблагодарили
    1,315 сообщений
    Mentioned
    38 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Все знают традиционный вариант преобразования HEX полубайта в символ
    Код:
    		cpi	0Ah
    		jc	$+5
    		adi	7
    		adi	30h
    Некоторые (теперь и я) знают оптимизированный вариант для x86 с вычитанием и десятичной коррекцией, котрый предложил Norbert Juffa.
    Этот вариант 1 в 1 преобразуется для z80 (возможно там он его и подсмотрел), а вот 8080/85/ВМ1 не поддерживают десятичную коррекцию после вычитания.
    Берем идею, по сравнению с z80 добавляется cmc (что сущая ерунда на фоне традиционного подхода)
    Код:
    		cpi	0Ah
    		cmc
    		aci	30h
    		daa
    Редкая, но приятная ситуация, когда получается одновременно ускорить и сократить.

    Эти 6 пользователя(ей) поблагодарили ivagor за это полезное сообщение:

    andrews(21.07.2023), Improver(21.07.2023), Oleg N. Cher(21.07.2023), parallelno(21.07.2023), Pyk(28.07.2023), svofski(22.07.2023)

  3. #283

    Регистрация
    29.06.2022
    Адрес
    г. Ирвайн, США
    Сообщений
    408
    Спасибо Благодарностей отдано 
    586
    Спасибо Благодарностей получено 
    340
    Поблагодарили
    109 сообщений
    Mentioned
    3 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Если я правильно нагуглил описание команды daa, то она устанавливает флаг carry в один если коррекция была. Если я ничего не напутал то вроде должно работать следующие:
    Daa
    Aci 30h

    Поправьте пожалуйста если ошибся

    Этот пользователь поблагодарил parallelno за это полезное сообщение:

    ivagor(22.07.2023)

  4. #284

    Регистрация
    07.08.2008
    Адрес
    г. Уфа
    Сообщений
    8,386
    Спасибо Благодарностей отдано 
    763
    Спасибо Благодарностей получено 
    2,365
    Поблагодарили
    1,315 сообщений
    Mentioned
    38 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Для уточнения тонкостей работы команд 8080 удобно ориентироваться на проверенные реализации 8080, например
    Если у нас исходная цифра в младшем полубайте, то переноса в CY не будет, только в AC (если A-F), поэтому к сожалению ACI тут не поможет и единицы не хватает (для A-F).

    - - - Добавлено - - -

    Можно вычитать не до DAA, а после и тогда избавляемся от CMC и, казалось бы, догоняем по эффективности x86 и z80. Но есть проблема - в большинстве случаев мы используем преобразование полубайта в составе преобразования байта и перед данным фрагментом будет команда ANI 0Fh, которая установит AC и для его сброса придется добавить например ORA A.
    Код:
    		ora a
    		daa
    		cpi 10h
    		sbi 0CFh
    - - - Добавлено - - -

    parallelno, спасибо, после твоего поста взглянул на проблему комплексно и получилось вот что (ORI 0F0h вместо ANI 0Fh в традиционном варианте):
    Код:
    		ori 0F0h
    		daa
    		cpi 60h
    		sbi 1Fh
    Т.е. в итоге само преобразование полубайта сравнялось по эффективности с z80, а 8080 не так уж плох.

    Эти 2 пользователя(ей) поблагодарили ivagor за это полезное сообщение:

    Improver(27.07.2023), parallelno(22.07.2023)

  5. #285

    Регистрация
    29.06.2022
    Адрес
    г. Ирвайн, США
    Сообщений
    408
    Спасибо Благодарностей отдано 
    586
    Спасибо Благодарностей получено 
    340
    Поблагодарили
    109 сообщений
    Mentioned
    3 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Вроде ani сбрасывает carry флаг?

    - - - Updated - - -

    Если следовать реализации которую ты указал то можно сдвинуть вначале на b0h, а потом вычесть 60h
    Adi b0h
    Daa
    Cmc
    Sui 61h
    Или что-то упускаю?

    - - - Updated - - -

    Не sui, а вычесть с carry. Но я по памяти не помню мнемонику

    - - - Updated - - -

    Или не 61h, а 5fh, нужно покумекать )

    - - - Updated - - -

    Да, вроде нужно вычесть с carry 2fh, чтобы стало +30h для чисел, и +37h для букв

    - - - Updated - - -

    Не, я все напутал. Но ответ где-то рядом. Сейчас соберусь и напишу. )

    - - - Updated - - -

    Adi b0h
    Daa
    Aci 30h

    - - - Updated - - -

    Поправка.
    Adi a0h
    Daa
    Aci 30h

    - - - Updated - - -

    Если мой код работает, то с ani 0fh получается по тактам тоже самое что у тебя.

    - - - Updated - - -

    А если так
    Ori f0h
    Daa
    Прибавить аккуратно с carry чтобы попасть в нужное значение


    - - - Updated - - -

    Прибавить кажется нужно что то вроде такого a0h + 30h - f0h
    Последний раз редактировалось parallelno; 22.07.2023 в 10:12.

  6. #286

    Регистрация
    07.08.2008
    Адрес
    г. Уфа
    Сообщений
    8,386
    Спасибо Благодарностей отдано 
    763
    Спасибо Благодарностей получено 
    2,365
    Поблагодарили
    1,315 сообщений
    Mentioned
    38 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от parallelno Посмотреть сообщение
    А если так
    Ori f0h
    Daa
    Прибавить аккуратно с carry чтобы попасть в нужное значение
    Честно говоря я не понимаю. Варианты, которые я привел решают задачу преобразования полубайта hex->символ или отдельно или в составе преобразования байта, а какую задачу ты предлагаешь решать?

  7. #286
    С любовью к вам, Yandex.Direct
    Размещение рекламы на форуме способствует его дальнейшему развитию

  8. #287

    Регистрация
    29.06.2022
    Адрес
    г. Ирвайн, США
    Сообщений
    408
    Спасибо Благодарностей отдано 
    586
    Спасибо Благодарностей получено 
    340
    Поблагодарили
    109 сообщений
    Mentioned
    3 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Что кажется равносильно e0h.
    То есть код будет
    Ori f0h
    Daa
    Aci e0h

    - - - Updated - - -

    Я пытаюсь решить задачу преобразования числа от нуля до 15 в hex символ.

    - - - Updated - - -

    Логика в коде такая:
    Делаем из числа от нуля до 15 число от от f0h до ffh.
    Затем используем daa. Если число от f0h до f9h, то daa прибавляет 60h и сбрасывает carry. Диапазон получается от 50h до 59h, после прибавляем e0h, получаем диапазон от 30h до 39h.
    Если число было от 10 до 15, то daa команда прибавит ещё 6 и установит carry, а aci прибавит carry.

    - - - Updated - - -

    Возможно я где-то ошибся, поправь пожалуйста

  9. #288

    Регистрация
    07.08.2008
    Адрес
    г. Уфа
    Сообщений
    8,386
    Спасибо Благодарностей отдано 
    763
    Спасибо Благодарностей получено 
    2,365
    Поблагодарили
    1,315 сообщений
    Mentioned
    38 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    DAA в таком случае всегда будет устанавливать CY и этот код правильно будет работать только для A-F. Если заменить ACI на ADI, то правильно будет работать только для 0-9.

    Этот пользователь поблагодарил ivagor за это полезное сообщение:

    parallelno(22.07.2023)

  10. #289

    Регистрация
    29.06.2022
    Адрес
    г. Ирвайн, США
    Сообщений
    408
    Спасибо Благодарностей отдано 
    586
    Спасибо Благодарностей получено 
    340
    Поблагодарили
    109 сообщений
    Mentioned
    3 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Точно. Спасибо за подсказку! Нужно ещё покумекать потом будет

    - - - Updated - - -

    Было бы классно проверить на реальном векторе выставляется ли флаг переноса когда происходит коррекция младших четырех бит.

  11. #290

    Регистрация
    07.08.2008
    Адрес
    г. Уфа
    Сообщений
    8,386
    Спасибо Благодарностей отдано 
    763
    Спасибо Благодарностей получено 
    2,365
    Поблагодарили
    1,315 сообщений
    Mentioned
    38 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    По поводу флагов 8080 (причем и у клонов интел, в т.ч. ВМ80, и у amd) уже все проверяли на реалах. С 8085 и z80 тоже все выяснили. Из околовекторовских процов недоэмулирован только 580ВМ1, но и там, насколько помню, неточности не касаются CY и AC.

Страница 29 из 35 ПерваяПервая ... 252627282930313233 ... ПоследняяПоследняя

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Похожие темы

  1. Вычисление числа Пи на ассемблере
    от perestoronin в разделе Разное
    Ответов: 330
    Последнее: 06.08.2025, 15:04
  2. Ответов: 275
    Последнее: 16.12.2018, 23:01
  3. try-catch на ассемблере z80
    от siril в разделе Программирование
    Ответов: 22
    Последнее: 30.10.2012, 21:17
  4. Продам книгу- AMIGA: программирование на ассемблере
    от Doctor Max в разделе Барахолка (архив)
    Ответов: 11
    Последнее: 01.03.2012, 00:35
  5. Подпрограмма на ассемблере в памяти?
    от jimled в разделе Программирование
    Ответов: 1
    Последнее: 29.11.2009, 06:46

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •