Дата: Понедельник, 22.11.2010, 18:18 | Сообщение # 23
Пятикурсник
Группа: Проверенные
Сообщений: 160
Статус: Оффлайн
Quote (kam)
Может кто подскажет более доходчивый коспект?
В другом разделе уже выкладывал ссылку http://kalashnikoff.ru/Assembler/ . А большинство конспектов на ДО можно использовать только для... ай, не буду о плохом
Кто-то что-то ещё по конспектам учит? Кстати, привет одногрупнице(или одногрупнику) smile
приветики от одногрупницы ага, мне удобнее. Еще очень помогает гугль
Quote (GoodMan)
В другом разделе уже выкладывал ссылку http://kalashnikoff.ru/Assembler/ . А большинство конспектов на ДО можно использовать только для... ай, не буду о плохом smile
Пасиб за ссылочку. Ток чета я уже к конспекту привыкла, после того как прочна его раз 10 вдоль и поперек.
Help! Блин, туплю по-страшному уже вторую неделю. Почему у меня не работает??? Насколько я поняла, у меня просто при сравнении (cmp) значения в регистре с 10 получается наоборот, или не наоборот, кароче выдает неверные флаги. хотя в этой же проге в другой процедуре то же самое cmp работает как надо. Что я пропустила? Кому можно показать мой корявенький код? Есть спецы?
Выкладываю весь код, чтоб было понятнее. res - пока просто число чтобы проверить вывод на экран. Не работает сравнение cmp там, где выделено. Там где подчеркнуто - работает. Почему?
Code
data segment buffer db 5 dup (?) crlf db 0dh, 0ah, '$' msgVvChislo db 'Vvedite chislo ot 0 do 255:','$' msgOshVvoda db "Error. Povtorite vvod." ,"$" msgVvElem db "Vvedite poelementy massiv chisel ot 0 do 255:","$" msgVyvodRes db "Resultat = ","$" msgKonPRG db "The End.", "$"
msg5 db "ok." ,"$"
jsimv db 0h
res db 87h
string db 10 dup (?), 0dh, 0ah, '$' table db "0123456789"
data ends ;------------ stprint segment stack db 100h dup (?) stprint ends ;------------ code segment start: assume cs:code,ds:data,ss:stprint mov ax, data mov ds, ax
call insert_proc
; call main_proc
mov dx, offset crlf mov ah, 09h int 21h
mov dx, offset msgVyvodRes mov ah, 09h int 21h
call show_proc ;(y - chislo na vhod, string - stroka dlya vyvoda na vyhod)
mov dx, offset string mov ah, 09h int 21h
ProgEnd:
mov dx, offset crlf mov ah, 09h int 21h
mov dx, offset msgKonPRG mov ah, 09h int 21h
mov dx, offset crlf mov ah, 09h int 21h
mov ah, 4ch ;zanosim nomer funkcii prerivaniya s zaversheniem raboty programmu int 21h ;prerivanie s zaversheniem raboty programmu
insert_proc proc near Ret insert_proc EndP main_proc proc near ;(mass, isize - vhod, res - vyhod)
Ret main_proc EndP
show_proc proc near ;(y - chislo na vhod, string - stroka dlya vyvoda na vyhod)
xor cx,cx xor ax,ax mov al, res mov dl, 0Ah
Delenue: ; nachalo cikla mov ah, 0h ;ostatok obnulyaem div dl ;delim chislo iz registra "al" na 10 push ax ;rezultat deleniya pomeschaem v stek inc cx [b]cmp al, 0h[/b] ;sravnivaem chastnoe deleniya s 0 ja Delenue ;esli bolshe 0, to povtoryaem cikl
mov bx, offset table; ukazyvaem na tablicy preobrazovaniya mov di, offset string; ukazyvaem na stroku dlya preobrazovannogo chisla
TablPreobr:
pop ax ; shityvaem v "ax" iz steka cifry mov al, ah xlatb ;zamenyaem znacheniye iz "al" na sootv. znachenie iz tablicy ; mov byte ptr [di], ah stosb ;zanosim al v stroku vyvoda po adresu di inc di
kam, а в чем проверяешь правильность выполнения? Просто у меня все отработало, вроде правильно. Например, это:
Quote
VvodElem:
;zapominaem x kak kol-vo elementov massiva mov ah, x mov masSize, ah ;esli kol-vo elementov massiva zadano 0, to zavershaem programmy cmp ah, 0 je ProgEnd
При нуле выходит из программы как и должно.
PS. Только вот код ошибки завершения программы не нулевой - это так надо?
Странно... Все работает? И res выводится на экран как надо? Про код ошибки не совсем поняла... Типа не задаю flagOsh = 1 и выход к ProgEnd? P.S. ход работы в турбо дебаггере проверяю
Добавлено (02.12.2010, 23:00) --------------------------------------------- Фсе, разобралась. Мануал надо читать внимательнее. Всем спасибо за помощь
Сообщение отредактировал kam - Четверг, 02.12.2010, 21:01
Ошибка вот в чем была: Команда stosb помещает байт информации из al не в строку, а в ячейку памяти, адресуемую паройes:di/edi. Т.е. надо было дописать перед "TablPreobr:" mov ax, ds mov es, ax А в самом цикле убрать inc di, т.к. stosb делает это автоматически.
в результате получаем:
Code
show_proc proc near ;(y - chislo na vhod, string - stroka dlya vyvoda na vyhod)
xor cx,cx xor ax,ax mov al, res mov dl, 0Ah
Delenue: ; nachalo cikla mov ah, 0h ;ostatok obnulyaem div dl ;delim chislo iz registra "al" na 10 push ax ;rezultat deleniya pomeschaem v stek inc cx cmp al, 0h ;sravnivaem chastnoe deleniya s 0 ja Delenue ;esli bolshe 0, to povtoryaem cikl