Прошу помощи: ассемблер 80, работа с текстом

Тема в разделе "WASM.BEGINNERS", создана пользователем AlexSun, 3 ноя 2010.

  1. AlexSun

    AlexSun New Member

    Публикаций:
    0
    Регистрация:
    3 ноя 2010
    Сообщения:
    54
    Добрый вечер, уважаемые :)

    Дали в универе сегодня такое вот задание:
    Имею немного опыта при работе с числами, с текстом не сталкивался, поэтому прошу помощи.
    Исходный текст пускай будет в массиве text, сформированный - new. Может у кого-то это займет мало времени и напишет код?)

    Ну или же объясните мне:
    1. Как читать массив с последнего элемента?
    2. Как заменить один символ на другой? (Например нужно заменять 'a' на 'b'. Проверяем элемент массива = 'a', если да, меняем на 'b', если нет - идем дальше. Вот как сделать это "меняем на b"?)
    Но лучше готовый код. Нужно на завтра.
     
  2. edemko

    edemko New Member

    Публикаций:
    0
    Регистрация:
    25 ноя 2009
    Сообщения:
    454
    "асемблер 80" - это сегодняший асм, используемый на наших компютерах?
     
  3. AlexSun

    AlexSun New Member

    Публикаций:
    0
    Регистрация:
    3 ноя 2010
    Сообщения:
    54
    Под микропроцессор KP580BM80.
     
  4. punxer

    punxer Андрей

    Публикаций:
    0
    Регистрация:
    16 окт 2006
    Сообщения:
    1.327
    Адрес:
    Ржев
    начните сами. писать за вас никто не будет. начнете а тут поправим
     
  5. S_Alex

    S_Alex Alex

    Публикаций:
    0
    Регистрация:
    27 авг 2004
    Сообщения:
    561
    Адрес:
    Ukraine
    Гуртовцев Программы для микропроцессоров. Справочное пособие.
     
  6. AlexSun

    AlexSun New Member

    Публикаций:
    0
    Регистрация:
    3 ноя 2010
    Сообщения:
    54
    Начать я могу, но не знаю что делать.

    Код (Text):
    1. org 0800h
    2. lxi h,text
    Далее что делать?
    Нужно занести первый элемент массива text в A. mov a,m?
    Потом проверить его, если он цифра (как это проверить, какой командой? мне знакома только cpi) - заменить пробелом. Перенести его в new.
    Потом это все выполнять в цикле, который закончиться когда дойдет до знака $ в конце массива, это я вроде знаю как сделать.
     
  7. SII

    SII Воин против дзена

    Публикаций:
    0
    Регистрация:
    31 окт 2007
    Сообщения:
    1.483
    Адрес:
    Подмосковье
    А какие проблемы? Загрузить адрес последнего элемента, а после каждого считывания уменьшать его.

    Проверка, условный переход, загрузка нового значения (которая обходится переходом).
     
  8. punxer

    punxer Андрей

    Публикаций:
    0
    Регистрация:
    16 окт 2006
    Сообщения:
    1.327
    Адрес:
    Ржев
    читай мануал по процессору
    а сначала набросай алгоритм просто текстом
     
  9. AlexSun

    AlexSun New Member

    Публикаций:
    0
    Регистрация:
    3 ноя 2010
    Сообщения:
    54
    SII, можете привести примеры кода?

    Как-то так:
    1. Вводим массив text, переносим его элемент в A, проверяем не конец ли это массива (знак $), если да - летим в метку end
    Код (Text):
    1. lxi h,text
    2. mov m,a
    3. cikl:
    4. cpi '$'
    5. jz end
    Здесь надо проверить цифра это или нет. Как? 10 раз использовать команду cpi? Для 0-9. Если не цифра, пропускаем.
    Код (Text):
    1. jnz necifra
    Здесь надо заменить значение A на пробел. Как реализовать кодом?
    Код (Text):
    1. necifra:
    2. sta new
    3. end:
    4. hlt
    5. text:db 'tekst$'
    6. new:db 0
    7. end
    Читал уже когда-то мануал, даже в тетрадку писал :)
    За название книги спасибо, нашел-скачал, осталось когда-то почитать.
     
  10. FatMoon

    FatMoon New Member

    Публикаций:
    0
    Регистрация:
    28 ноя 2002
    Сообщения:
    954
    Адрес:
    Russia
    Код (Text):
    1.    lxi h, text
    2.    mvi c,1
    3. lb_loop:
    4.    mov a, m
    5.    cpi a, '$'
    6.    jz lb_two
    7.    cpi a, '9'
    8.    jnc lb_next
    9.    cpi a, '0'
    10.    jc lb_next
    11.    mvi m, ' '
    12. lb_next:
    13.    inr c
    14.    inx h
    15.    jmp lb_loop
    16.  
    17. lb_two:
    18.    lxi h, text
    19.    lxi d, new
    20.    add e,c
    21.    adc d,0
    22. lb_loop2:
    23.    mov a,m
    24.    stox d
    25.    inx h
    26.    dcx d
    27.    dcr c
    28.    jnz lb_loop2
    как-то так, если я чего-то еще помню... давно это было. Даже если ошибся, можно понять, где, если вы сейчас мучаете ВМ80

    ЗЫ: конечно же, лучше сделать немного по другому... начиная с lb_two:
    Код (Text):
    1. ...
    2. lb_two:
    3.    lxi d, new
    4.    dcx h
    5.    mov a,m
    6.    stox d
    7.    inx d
    8.    dcr c
    9.    jnz lb_two
    10.    mvi a, '$'
    11.    stox d
    12. ...
     
  11. AlexSun

    AlexSun New Member

    Публикаций:
    0
    Регистрация:
    3 ноя 2010
    Сообщения:
    54
    Первый код в дебаггере выдает ошибку синтаксиса (хотя лично я ее не вижу). И еще ж массив new должен быть развернутым массивом text.
    Например text="qwerty", должно new="ytrewq".

    Спасибо огромное :)
    Завтра попробую разобраться, сейчас уже плохо думается...
     
  12. AlexSun

    AlexSun New Member

    Публикаций:
    0
    Регистрация:
    3 ноя 2010
    Сообщения:
    54
    Хотелось бы увидеть пример кода, который берет массив MAS1 (который в регистре HL), разворачивает его (например было "йцукен", стало "некуцй") и заносит в MAS2 (BC). Буду благодарен.
     
  13. max7C4

    max7C4 New Member

    Публикаций:
    0
    Регистрация:
    17 мар 2008
    Сообщения:
    1.203
    алгоритм такой. пример кода сам придумай
    0) hl = MAS1
    1) bc = MAS1 + длина массива MAS1
    2) уменьшить bc на размер элемента
    3) a = элемент, на который указывает hl + элемент, на который указывает bc
    4) элемент, на который указывает hl = a - элемент, на который указывает hl
    5) элемент, на который указывает bc = a - элемент, на который указывает bc
    6) увеличить hl на размер элемента
    7) если hl < bc, то перейти к пункту 2
    8) hl = MAS1
    9) bc = MAS2
    A) если hl >= MAS1 + длина массива MAS1, то конец
    B) a = элемент, на который указывает hl
    C) элемент, на который указывает bc = a
    D) увеличить hl на размер элемента
    E) увеличить bc на размер элемента
    F) если hl < MAS1 + длина массива MAS1, то перейти к пункту B
     
  14. Kirow

    Kirow New Member

    Публикаций:
    0
    Регистрация:
    16 окт 2010
    Сообщения:
    24
    сразу пишу - про асемблер 80 - не знаю., но на масме когда учил команды условного перехода написал программку которая из двух текстовых строк лепила одну новую, но с отсортироваными по убыванию символами.
    т.е. было s1=zxqpn s2=vusl стало s3=zxvusqpnl
    Код не оптимизирован, но работает. Выкладываю на случай вдруг найдете что-то нужное
    Код (Text):
    1. .686
    2. .model flat, stdcall
    3. option casemap :none
    4.     include windows.inc
    5.     include masm32.inc
    6.     include kernel32.inc
    7.     include C:\masm32\macros\macros.asm
    8.     includelib masm32.lib
    9.     includelib kernel32.lib
    10. .data
    11.     str1 db "zxqpn",0
    12.     str2 db "vusl",0
    13.     d=$-str1
    14.     str3 db d dup (0)
    15.     a db ?              ;количество элементов первой строки
    16.     b db ?              ;количество элементов второй строки
    17.     ent db 13,10,0      ;переход на новую строку
    18.  
    19. .code
    20.  
    21. Start:
    22.     mov bl,0
    23.     mov esi,offset str1
    24.  
    25. loop1:
    26.     lodsb   ;Считаем кол-во элементов первой строки (в esi адресс строки)
    27.     cmp al,0    ;возвращает в al bl-тый символ строки
    28.     je exit1    ;если 0 - конец строки,в bl кол-во символов
    29.     inc bl      ;если не ноль - увеличиваем счетчик
    30.     jmp loop1  
    31.  
    32. exit1:
    33.     mov a,bl
    34.     mov bl,0
    35.     mov esi,offset str2
    36.     loop2:     
    37.         lodsb   ;Считаем кол-во элементов второй строки
    38.         cmp al,0   
    39.         je exit2
    40.         inc bl
    41.         jmp loop2
    42.  
    43.  
    44. exit2:
    45.     mov b,bl
    46.     mov eax,0   ;i
    47.     mov ebx,0   ;j
    48.     mov ecx,0   ;k
    49.    
    50.  
    51. Cycle1:
    52.     mov dl,[str1+eax]
    53.     cmp dl,[str2+ebx]
    54.     jge then1   ;>=
    55.  
    56.     mov dl,[str2+ebx]
    57.     mov [str3+ecx],dl
    58.     inc ebx
    59.     inc ecx
    60.     jmp Cycle2
    61.  
    62. then1:
    63.     mov [str3+ecx],dl
    64.     inc ecx
    65.     inc eax
    66.  
    67. Cycle2:
    68.     cmp bl,b
    69.     jne Cycle4  ;!=
    70.  
    71. Cycle3:
    72.     cmp al,a
    73.     je EndCycles
    74.     mov dl,[str1+eax]
    75.     mov [str3+ecx],dl
    76.     inc eax
    77.     inc ecx
    78.     jmp Cycle3
    79.    
    80. Cycle4:
    81.     cmp al,a
    82.     jne Cycle1
    83.     Cycle5:
    84.     cmp bl,b
    85.     je EndCycles    
    86.     mov dl,[str2+ebx]
    87.     mov [str3+ecx],dl
    88.     inc ebx
    89.     inc ecx
    90.     jmp Cycle5
    91.    
    92.     EndCycles:
    93.         print ADDR str1
    94.         print addr ent
    95.         print ADDR str2
    96.         print addr ent
    97.         print ADDR str3
    98.         print addr ent
    99.     ret
    100. end Start