Добрый вечер, уважаемые Дали в универе сегодня такое вот задание: Имею немного опыта при работе с числами, с текстом не сталкивался, поэтому прошу помощи. Исходный текст пускай будет в массиве text, сформированный - new. Может у кого-то это займет мало времени и напишет код?) Ну или же объясните мне: 1. Как читать массив с последнего элемента? 2. Как заменить один символ на другой? (Например нужно заменять 'a' на 'b'. Проверяем элемент массива = 'a', если да, меняем на 'b', если нет - идем дальше. Вот как сделать это "меняем на b"?) Но лучше готовый код. Нужно на завтра.
Начать я могу, но не знаю что делать. Код (Text): org 0800h lxi h,text Далее что делать? Нужно занести первый элемент массива text в A. mov a,m? Потом проверить его, если он цифра (как это проверить, какой командой? мне знакома только cpi) - заменить пробелом. Перенести его в new. Потом это все выполнять в цикле, который закончиться когда дойдет до знака $ в конце массива, это я вроде знаю как сделать.
А какие проблемы? Загрузить адрес последнего элемента, а после каждого считывания уменьшать его. Проверка, условный переход, загрузка нового значения (которая обходится переходом).
SII, можете привести примеры кода? Как-то так: 1. Вводим массив text, переносим его элемент в A, проверяем не конец ли это массива (знак $), если да - летим в метку end Код (Text): lxi h,text mov m,a cikl: cpi '$' jz end Здесь надо проверить цифра это или нет. Как? 10 раз использовать команду cpi? Для 0-9. Если не цифра, пропускаем. Код (Text): jnz necifra Здесь надо заменить значение A на пробел. Как реализовать кодом? Код (Text): necifra: sta new end: hlt text:db 'tekst$' new:db 0 end Читал уже когда-то мануал, даже в тетрадку писал За название книги спасибо, нашел-скачал, осталось когда-то почитать.
Код (Text): lxi h, text mvi c,1 lb_loop: mov a, m cpi a, '$' jz lb_two cpi a, '9' jnc lb_next cpi a, '0' jc lb_next mvi m, ' ' lb_next: inr c inx h jmp lb_loop lb_two: lxi h, text lxi d, new add e,c adc d,0 lb_loop2: mov a,m stox d inx h dcx d dcr c jnz lb_loop2 как-то так, если я чего-то еще помню... давно это было. Даже если ошибся, можно понять, где, если вы сейчас мучаете ВМ80 ЗЫ: конечно же, лучше сделать немного по другому... начиная с lb_two: Код (Text): ... lb_two: lxi d, new dcx h mov a,m stox d inx d dcr c jnz lb_two mvi a, '$' stox d ...
Первый код в дебаггере выдает ошибку синтаксиса (хотя лично я ее не вижу). И еще ж массив new должен быть развернутым массивом text. Например text="qwerty", должно new="ytrewq". Спасибо огромное Завтра попробую разобраться, сейчас уже плохо думается...
Хотелось бы увидеть пример кода, который берет массив MAS1 (который в регистре HL), разворачивает его (например было "йцукен", стало "некуцй") и заносит в MAS2 (BC). Буду благодарен.
алгоритм такой. пример кода сам придумай 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
сразу пишу - про асемблер 80 - не знаю., но на масме когда учил команды условного перехода написал программку которая из двух текстовых строк лепила одну новую, но с отсортироваными по убыванию символами. т.е. было s1=zxqpn s2=vusl стало s3=zxvusqpnl Код не оптимизирован, но работает. Выкладываю на случай вдруг найдете что-то нужное Код (Text): .686 .model flat, stdcall option casemap :none include windows.inc include masm32.inc include kernel32.inc include C:\masm32\macros\macros.asm includelib masm32.lib includelib kernel32.lib .data str1 db "zxqpn",0 str2 db "vusl",0 d=$-str1 str3 db d dup (0) a db ? ;количество элементов первой строки b db ? ;количество элементов второй строки ent db 13,10,0 ;переход на новую строку .code Start: mov bl,0 mov esi,offset str1 loop1: lodsb ;Считаем кол-во элементов первой строки (в esi адресс строки) cmp al,0 ;возвращает в al bl-тый символ строки je exit1 ;если 0 - конец строки,в bl кол-во символов inc bl ;если не ноль - увеличиваем счетчик jmp loop1 exit1: mov a,bl mov bl,0 mov esi,offset str2 loop2: lodsb ;Считаем кол-во элементов второй строки cmp al,0 je exit2 inc bl jmp loop2 exit2: mov b,bl mov eax,0 ;i mov ebx,0 ;j mov ecx,0 ;k Cycle1: mov dl,[str1+eax] cmp dl,[str2+ebx] jge then1 ;>= mov dl,[str2+ebx] mov [str3+ecx],dl inc ebx inc ecx jmp Cycle2 then1: mov [str3+ecx],dl inc ecx inc eax Cycle2: cmp bl,b jne Cycle4 ;!= Cycle3: cmp al,a je EndCycles mov dl,[str1+eax] mov [str3+ecx],dl inc eax inc ecx jmp Cycle3 Cycle4: cmp al,a jne Cycle1 Cycle5: cmp bl,b je EndCycles mov dl,[str2+ebx] mov [str3+ecx],dl inc ebx inc ecx jmp Cycle5 EndCycles: print ADDR str1 print addr ent print ADDR str2 print addr ent print ADDR str3 print addr ent ret end Start