powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Ошибка в программе на asm
20 сообщений из 20, страница 1 из 1
Ошибка в программе на asm
    #34223783
The_answer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Программа выполнена полностью по заданию. Но когда компилирую и нажимаю клавишу то происходит ее зависание. С чем связано?
Условие задачи:
Разработать программу, которая будет устанавливать новый обработчик прерывания от клавиатуры 09h.Для установки новых векторов прерываний использовать функции 25h и 35h прерывания 21h. Программа установки нового обработчика должна обеспечить проверку наличия нового обработчика в памяти и выводить сообщение "Обработчик уже есть в памяти" либо "Обработчик успешно установлен". В первом случае программа завершает работу без установки резидента. Во втором - заменяет вектор прерывания и завершает работу оставляя резидентную часть в памяти
Новый обработчик должен выполнять следующие функции:
При нажатии на любую клавишу в левом верхнем углу экрана отображать скан-код клавиши.
Нажатие F6 - восстановление старого обработчика прерывания 09h

тектс программы:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
DATA SEGMENT

  old_09_o dw ?
  old_09_s dw ?
  str1 db "Click F6!", 0Dh,0Ah,'$'
  counter db  0 
tbl_hex db '0123456789ABCDEF'
buff    db '-> '
	db  4  dup ('*')
	db  10 ,  13 , '$'
DATA ENDS

SSEG SEGMENT STACK
   db  200  dup(?)
SSEG ENDS

CODE SEGMENT
  assume cs:code,ds:data,ss:sseg
  begin:
        mov ax,data
        mov ds,ax
                  
        ;определяем значение вектора 09h, сохраняем их

        mov ax,3509h 
        int 21h
        mov old_09_s,es
        mov old_09_o,bx
     
        ;устанавливаем новое значение векторов
        
        push ds
        push cs
        pop ds
        mov dx,offset cs:INT09
        mov ax,2509h
        int 21h
        pop ds

     metka:
          cmp counter, 100 
          jbe metka

          ;восстанавливаем старое значение векторов
         
          push ds
          pop es
        
           call goBack

          ;выходим в DOS

          mov ah,4ch
          int 21h

       INT09 proc far

             push ax
             push es
             push ds

             mov ax,data
             mov ds,ax


in al,60h

      m2:   
           cmp	al,40h
            je	text1
key_down_loop:

mov	si, offset buff
	add	si,  3 
	call	hex2str
	
	; Выводим
	mov	ah, 09h
	mov	dx, offset buff
	int	21h		
	jmp	key_down_loop

text1:
   
           mov ah,09h
           mov dx,offset str1     
           int 21h
      



       
    m:      pushf
            inc counter
            call dword ptr ds:[old_09_o]
            pop ds
            pop es
            pop ax
            
            iret
       INT09 ENDP



hex2str proc
	push	bx
	push	cx
	push	dx

	mov	bx, 0F000h
	mov	dx,  12 
	mov 	cx,  4 
convert_loop:
	push	ax
	push	cx
	and	ax, bx
	mov	cx, dx
	shr	ax, cl
	pop	cx
	push 	bx
	mov  	bx, offset tbl_hex
	xlat
	mov  	[si], al
	pop  	bx
	sub	dl,  4 	
	ror	bx,  4 
	inc	si
	pop	ax
	loop	convert_loop
	pop	dx
	pop	cx
	pop	bx
	ret
hex2str endp


        goBack	proc

         mov dx,es:old_09_o
          mov ds,es:old_09_s
          mov ax,2509h
          int 21h

	goBack	endp




 CODE ENDS
 END BEGIN

...
Рейтинг: 0 / 0
Ошибка в программе на asm
    #34223793
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
The_answerПрограмма выполнена полностью по заданию. Но когда компилирую и нажимаю клавишу то происходит ее зависание. С чем связано?
Ну... попробую прокомментировать сделанное. Хотя оговорюсь, что не занимался этим лет этак десять с лишним.

The_answerПрограмма установки нового обработчика должна обеспечить проверку наличия нового обработчика в памяти
Этого, признаться, я так и не увидел.

The_answerDATA SEGMENT
Хм. В какой модели ты компилируешь? Такую программу естественно делать в com-формате.

The_answerSSEG SEGMENT STACK
db 200 dup(?)
SSEG ENDS
А стоит ли? К тому же, если уж выделено место для стека, его хорошо бы где-нибудь использовать, чего я опять же не увидел.

The_answer
metka:
cmp counter,100
jbe metka
Хм. В задании сказано "установить программу резидентом", а не "организовать цикл в ожидании завершения программы".

The_answerin al,60h
Хм. Допустим. Хотя что-то мне кажется, что не все так просто; была какая-то тонкость, кажется для AT-клавиатур для кода освобождения клавиши надо было читать второй байт.

The_answer
key_down_loop:

mov si, offset buff
add si, 3
call hex2str

; Выводим
mov ah, 09h
mov dx, offset buff
int 21h
jmp key_down_loop
Глубоко задумался, каким образом программа собирается выйти из этого цикла, если она сюда попала.

The_answer
m: pushf
Это имеется в виду обеспечение iret-возврата из старого обработчика?

The_answer call dword ptr ds:[old_09_o]
Хм. Вызвать старый обработчик - дело конечно хорошее. Вопрос в том, что он вроде как собирается читать нажатую клавишу, а ты ее уже прочитал. Не уверен, чем закончится такой эксперимент.

The_answer iret
INT09 ENDP
Хм. Опять же по воспоминаниям, INT09 относится к NMI, а это значит, что при выходе из него надо разрешить NMI, кажется через регистр 20h. В твоем коде эту функцию выполнил бы старый обработчик, но я бы ожидал у него проблем на чтении из порта.

The_answerhex2str proc
Эту функцию ты легко можешь отладить отдельно, так что и не собираюсь смотреть внутрь.

The_answer goBack proc
Процедура не то чтобы на месте, да и не очень-то нужно ее выделять. Вообще, резиденты принято строить так: сначала резидентная часть, вместе с необходимыми ей данными, потом нерезидентная часть со своими данными.
...
Рейтинг: 0 / 0
Ошибка в программе на asm
    #34223864
Фотография Ruslan.Isbarov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хех...

hex2str - знакомый код. Где то это я уже видел ;) ...

2The_answer: лично мне как то неохота в такой каше разбираться. Может быть завтра гляну. А вообще неплохо было бы причесать код, камментов понаписать. Глядишь, сам бы понял что написал. И часть багов бы пофиксил.


2softwarer & The_answer:

softwarer
The_answerin al,60h
Хм. Допустим. Хотя что-то мне кажется, что не все так просто; была какая-то тонкость, кажется для AT-клавиатур для кода освобождения клавиши надо было читать второй байт.


Я же тебе еще в прошлом твоем треде писал, что если ты будешь делать обработчик прерывания, читай из порта.


softwarer
The_answerSSEG SEGMENT STACK
db 200 dup(?)
SSEG ENDS
А стоит ли? К тому же, если уж выделено место для стека, его хорошо бы где-нибудь использовать, чего я опять же не увидел.


push/pop - шо це таке? це работа со стеком! Более того вызывается подпрограмма hex2str. А шо в итоге? А на стек кладется адрес возврата. Содержимое IP. Це архитектурные особенности 8086. Более того, если не определить сегмент стека ваще интересная штука получится. Окажется так что содержимое регистра SS будет совпадать с содержимым регистра CS. А вот регистр SP будет содержать значение 0. О какие интересные вещи творятся! Первая же команда push уменьшит значение SP на 2 и его значение станет равным FFFEh. А теперь все вместе угадаем, какая гадость может случиться (только не в этой программе :) )??? Так что объявление сегмента стека нужно считать хорошим тоном...

P.S. Будешь резидента создавать, туда не вздумай запихать.


softwarer
The_answer
key_down_loop:

mov si, offset buff
add si, 3
call hex2str

; Выводим
mov ah, 09h
mov dx, offset buff
int 21h
jmp key_down_loop
Глубоко задумался, каким образом программа собирается выйти из этого цикла, если она сюда попала.


Наверное по CTRL + C ;)



_______________________________


P.S. Увиденное может нанести психологическую травму . Самому то удобно разбираться в этаком???
Короче: RTFM, RTFM и еще раз RTFM. И неплохо было бы научиться писать удобочитаемый код (да, даже на асме).
...
Рейтинг: 0 / 0
Ошибка в программе на asm
    #34223866
The_answer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
НУ я протсо новичок в asme. Посмотри, плиз, что можно исправить. А там действительно часть твоей программы. Делал очень быстро. Что ужас и сам знаю, не люблю жутко asm
...
Рейтинг: 0 / 0
Ошибка в программе на asm
    #34223871
Фотография Ruslan.Isbarov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
The_answerНУ я протсо новичок в asme. Посмотри, плиз, что можно исправить.

Да тут, все заново переписывать нужно... В свободное время перепишу, но до четверга буду занят. => результат сюда скину только в четверг вечером... Не тебе, так может другим поможет.


The_answerЧто ужас и сам знаю, не люблю жутко asm

Вот сам себе яму и выкопал. Только зря свое время потратил...
...
Рейтинг: 0 / 0
Ошибка в программе на asm
    #34223880
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ruslan.IsbarovБолее того, если не определить сегмент стека ваще интересная штука получится. Окажется так что содержимое регистра SS будет совпадать с содержимым регистра CS. А вот регистр SP будет содержать значение 0. О какие интересные вещи творятся! Первая же команда push уменьшит значение SP на 2 и его значение станет равным FFFEh. А теперь все вместе угадаем, какая гадость может случиться (только не в этой программе :) )??? Так что объявление сегмента стека нужно считать хорошим тоном...
Во-первых, одно дело - управление стеком. Совсем другое - выделение под него места в файле на диске. Имхо это малость нелогично.

Во-вторых, не помню как в exe-формате, может там SS в результате работы этой программы и будет инициализирован. Если делать ее нормально, в com формате, об этом таки стоит позаботиться, иначе это будет просто потраченное место.

Наконец, подпрограмме hex2str на этот стек глубочайшим образом наплевать, поскольку вызывается она из обработчика прерывания, и стек у нее будет досовский (если программа, конечно, не захочет явно перейти к использованию собственного).
...
Рейтинг: 0 / 0
Ошибка в программе на asm
    #34224636
Фотография Ruslan.Isbarov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarer Ruslan.IsbarovБолее того, если не определить сегмент стека ваще интересная штука получится. Окажется так что содержимое регистра SS будет совпадать с содержимым регистра CS. А вот регистр SP будет содержать значение 0. О какие интересные вещи творятся! Первая же команда push уменьшит значение SP на 2 и его значение станет равным FFFEh. А теперь все вместе угадаем, какая гадость может случиться (только не в этой программе :) )??? Так что объявление сегмента стека нужно считать хорошим тоном...

Во-первых, одно дело - управление стеком. Совсем другое - выделение под него места в файле на диске. Имхо это малость нелогично.

Что то не пойму тебя. Какое управление? В кои то века команды push (поместить в стек) и pop (снять со стека) относят к командам управления стеком???
Какой вообще диск??? Имеешь в виду exe-файл? Как ты сказал, "место для стека выделено, его хорошо бы где-нибудь использовать". Ну вот я и показал где он используется.

softwarer
Во-вторых, не помню как в exe-формате, может там SS в результате работы этой программы и будет инициализирован.


Не может, а точно . RTFM перед тем как утверждать.

softwarerЕсли делать ее нормально, в com формате, об этом таки стоит позаботиться, иначе это будет просто потраченное место.

А про com ничего и не говорилось. Разговор идет о том что есть на текущий момент.
...
Рейтинг: 0 / 0
Ошибка в программе на asm
    #34225189
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ruslan.IsbarovЧто то не пойму тебя. Какое управление?
В данном случае - выделение места. По коду просится еще и в обработчике прерывания переключаться на использование этого стека, хотя имхо это излишество.

Ruslan.IsbarovКакой вообще диск??? Имеешь в виду exe-файл?
Да.

Ruslan.IsbarovКак ты сказал, "место для стека выделено, его хорошо бы где-нибудь использовать". Ну вот я и показал где он используется.
Там он используется мягко говоря не на двести байт.

Ruslan.Isbarov softwarer
Во-вторых, не помню как в exe-формате, может там SS в результате работы этой программы и будет инициализирован.

Не может, а точно . RTFM перед тем как утверждать.
Руслан, перед тем как утверждать, я обычно еще и проверяю, если так не уверен. Когда я не хочу проверять, я говорю "не уверен", "не помню" итп, что видно в квоте выше. Если ты не понимаешь значения слова "утверждать" - держи свои команды при себе, или на крайняк пихай в код.

Ruslan.Isbarov softwarerЕсли делать ее нормально, в com формате, об этом таки стоит позаботиться, иначе это будет просто потраченное место.
А про com ничего и не говорилось.
Мной - говорилось, еще до того, как ты появился в топике.
...
Рейтинг: 0 / 0
Ошибка в программе на asm
    #34226077
Фотография Ruslan.Isbarov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
О, наконец то... Конкретизировал. И про управление и про использование стека...

Глядя на твое сообщение

softwarerА стоит ли? К тому же, если уж выделено место для стека, его хорошо бы где-нибудь использовать, чего я опять же не увидел.

складывается мнение, что ты вообще недоумеваешь о том, что в программе присутствует сегмент стека. А не о том, что не все 200 байт будут использованы. Извини, телепаты в отпуске...

P.S. вот видишь, сколько флейма из-за неточности.

__________________________________________________________

softwarerВо-первых, одно дело - управление стеком. Совсем другое - выделение под него места в файле на диске. Имхо это малость нелогично.

softwarer Ruslan.IsbarovЧто то не пойму тебя. Какое управление?
В данном случае - выделение места.

Твои утверждения, мягко говоря, противоречат друг другу.
...
Рейтинг: 0 / 0
Ошибка в программе на asm
    #34226183
kolobok0
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
The_answerПрограмма выполнена полностью по заданию. Но когда компилирую и нажимаю клавишу то происходит ее зависание. С чем связано?
Условие задачи:
Разработать программу, которая будет устанавливать новый обработчик прерывания от клавиатуры 09h.Для установки новых векторов прерываний использовать функции 25h и 35h прерывания 21h. Программа установки нового обработчика должна обеспечить проверку наличия нового обработчика в памяти и выводить сообщение "Обработчик уже есть в памяти" либо "Обработчик успешно установлен". В первом случае программа завершает работу без установки резидента. Во втором - заменяет вектор прерывания и завершает работу оставляя резидентную часть в памяти
Новый обработчик должен выполнять следующие функции:
При нажатии на любую клавишу в левом верхнем углу экрана отображать скан-код клавиши.
Нажатие F6 - восстановление старого обработчика прерывания 09h
....

азм нужно любить, если хотите писать на нём...
приведённый код не рабочий - раз, и не соответствует заданию - два. возможно скомпилён из нечто, но результат плачевный. В принцепе это уже прозвучало. Так же прозвучало о том, что лучше сфокусироваться на задаче, а не на формате получаемого исполняемого модуля. Просче похоронить пока рассуждения о различных сегментах (данных и иже) и барахтаться в одном - так называемая COM модель. Об этом так же прозвучало. По поводу инициализации стэка - полная чушь. Авторов чуши отправлю к Джордену и другим учебникам по досу, азму и иже.. См. раздел окружение запускаемого процесса, инициализация регистров и т.д.. Это Вам не первые шаги биоса, и не первые шаги микроконтроллера - совсем голову человеку запудрите... По поводу выделения места под стэк на диске - это уже перебор товарисчи. Ну нельзя же так ! Не уверены - не нуна, пожалуйста. Стэк - оласть памяти, организованная по принципу FILO и адресуемая через соответствующие регистры проца. Никакого отношения к дисковой подсистемы сие НЕ имеет...

теперь по сути вопроса - уже ответ дали. зацикливание в обработчике 9 прерывания. Вы отправляете в беспосадочный перелёт микропроцессор. От ся добавлю - вызывать из обработчика BIOS (9 вектор - аппаратный!), досовское прерывание (21) для отображения на дисплее - большая глупость. Если даже и будет дышать, то ходите по тонкому льду. См. потроха обработчика 21 прерывания (с его маркерами критических вхождений и иже). Более правильней - прямое отображение в видио память, либо задействование прерываний биоса 10h - помедленее чуток). Для этого (прямое отображение в видио память) нуна определить режим отображения (либо перевести в нужный) и по адрессу 0B800h либо 0B000h выводить Ваши потуги. Опять - лучше почитать класиков на данный счёт, потому как не всё так просто сделано - как сказано...

теперь по задачи...
не вдаваясь в азм Вам нуна решить следующие задачи...
1) детекция присутствия Вашего кода в памяти компа. Тут подходов несколько, но самый менее гиморный - обслужить некую свою функцию на определённом прерывании.. (например мультиплексном - см. 2fh)..
2) Обслуживать официальное оставление резидента в памяти (см. 27h прерывание - если не глючу). А так же освобождение сегмента. Не забывать про освобождение PSP !!! (типичная ошибка молодёжи)... Его адрес сможете найти (дай бох памяти) по 20h смещению ващего CS сегмента.
3) Скан код как тут прозвучало - из порта брать может не прокатить... Вам дорога на разборку кольцевого буфера под BIOS. Его чтение, без правки головы-хвоста... Лучше отрабатывать сие ПОСЛЕ основного тела 9h прерывания биоса...


удачи Вам
(круглый)
ЗЫ
Давно не брал в руки шашки :)) ностальжи прям..
...
Рейтинг: 0 / 0
Ошибка в программе на asm
    #34226194
Фотография Ruslan.Isbarov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kolobok0По поводу инициализации стэка - полная чушь. Авторов чуши отправлю к Джордену и другим учебникам по досу, азму и иже.. См. раздел окружение запускаемого процесса, инициализация регистров и т.д.. Это Вам не первые шаги биоса, и не первые шаги микроконтроллера - совсем голову человеку запудрите...

А вот с этого места, плиз, поподробнее. Что в моих утверждения Вам показалось чушью?


kolobok0По поводу выделения места под стэк на диске - это уже перебор товарисчи. Ну нельзя же так ! Не уверены - не нуна, пожалуйста.

Уважаемый, вы слышали об организации загружаемого модуля? Почитайте маны. Я г-на softwarer'а тоже не сразу понял. Оказывается он имел в виду exe-файл на диске и его структуру.


kolobok0Стэк - оласть памяти, организованная по принципу FILO и адресуемая через соответствующие регистры проца. Никакого отношения к дисковой подсистемы сие НЕ имеет...

"FILO" - это уже любопытно. Заставляет подумать о Вашей компетентности в данных вопросах.
...
Рейтинг: 0 / 0
Ошибка в программе на asm
    #34226237
Фотография Ruslan.Isbarov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kolobok0

Дабы развеять ваши сомнения по поводу инициализации стека, а заодно доказать свои утверждения, написал парочку тестовых программ:

1) Программа, имеющая 1 сегмент (сегмент кода):

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
code segment 'code'       				
	assume cs: code, ds: code 			

start:
	mov	ax, code
	mov	ds, ax
	
	mov	ah, 09h
	mov	dx, offset message
	int	21h
	
	mov	ax, 4c00h
	int 	21h
	
message db 'hello world!$'
                 				
code ends

end start

А теперь запустим эту программулину в дебагере (см. аттач). Смотрим и видим, что сегментные регистры CS и SS имеют одно и тоже значение. Регистр SP содержит значение 0. Думаю, что не все так запущено и вы знаете что стек растет в сторону младших адресов . А команда PUSH уменьшает значение регистра SP на 2. Эту ситуацию я описал выше.
...
Рейтинг: 0 / 0
Ошибка в программе на asm
    #34226240
Фотография Ruslan.Isbarov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2) Программа, имеющая сегмент стека:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
code segment 'code'       				
	assume cs: code, ds: data

start:
	mov	ax, data
	mov	ds, ax

	push	ds
	pop	es
	
	mov	ah, 09h
	mov	dx, offset message
	int	21h
	
	mov	ax, 4c00h
	int 	21h
code ends

data segment
	message db 'hello world!$'
data ends

stk segment stack
	dw	 128  dup ( 0 )
stk ends

end start

Смотрим в дебагере. Результат: сегментный регистр SS имеет значение, отличное от SS (что и следовало ожиадать).
...
Рейтинг: 0 / 0
Ошибка в программе на asm
    #34226242
Фотография Ruslan.Isbarov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
сорри, не приаттачил
...
Рейтинг: 0 / 0
Ошибка в программе на asm
    #34226246
Фотография Ruslan.Isbarov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кстати, вы можете увидеть, что во втором случае значение SP = 100h = 256 байт.

P.S.

kolobok0По поводу инициализации стэка - полная чушь

Похоже, единственным автором чуши являетесь вы.
...
Рейтинг: 0 / 0
Ошибка в программе на asm
    #34226268
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ruslan.IsbarovP.S. вот видишь, сколько флейма из-за неточности.
Бывает. Я несовершенен. Пока еще.

Ruslan.IsbarovТвои утверждения, мягко говоря, противоречат друг другу.
Ничуть. Поясняю по буквам: управлять стеком, а именно выделить ему место в оперативке, настроить SS/SP и так далее - нормально. Делать в файле сегмент неиспользуемого мусора с тем, чтобы после загрузки программы он стал стеком - мягко говоря, не самый удачный подход. С точностью до моих многих лет неработы с ассемблером я предполагаю, что этот исходник приведет к появлению в файле двух сотен нафиг не нужных нулей.
...
Рейтинг: 0 / 0
Ошибка в программе на asm
    #34226294
Фотография Ruslan.Isbarov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarer[quot Ruslan.Isbarov]P.S. вот видишь, сколько флейма из-за неточности.
Бывает. Я несовершенен. Пока еще.

Ruslan.Isbarovэтот исходник приведет к появлению в файле двух сотен нафиг не нужных нулей.

Нуууу... Много хочешь... С этим не угадаешь.
Да и вообще, нецелесообразно заниматься оптимизацией подобных вещей в контексте MS-DOS. Гораздо целесообразнее сконцентрировать внимание на других вещах (уж благо в вышеприведенном мясе они есть). По крайней мере, лично я не видел реализаций, в которых бы этому уделялось большое внимание. Для программулины уровня лаб. работы в универе, достаточно. Тем более, автор, наверное, не понимает смысла этих строк.
...
Рейтинг: 0 / 0
Ошибка в программе на asm
    #34227992
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ruslan.IsbarovНуууу... Много хочешь... С этим не угадаешь.
С чем? С тем, что эти байты нафиг не нужны, угадать несложно. И на месте препода я бы как раз за такие детали сильно резал оценку потому, что сделать нормально - элементарно, и наличие такого показывает просто халтурную работу.

Если так написано в методичке - я бы приобрел экземпляров сто этой методички. И убедил бы автор их съесть.

Ruslan.IsbarovДа и вообще, нецелесообразно заниматься оптимизацией подобных вещей в контексте MS-DOS.
Удачен ли выбор контекста преподом - вопрос преподу. Но в любом случае работу стоит делать хорошо.

Ruslan.IsbarovПо крайней мере, лично я не видел реализаций, в которых бы этому уделялось большое внимание. Для программулины уровня лаб. работы в универе, достаточно.
На тройку с минусом - достаточно.

Ruslan.IsbarovТем более, автор, наверное, не понимает смысла этих строк.
И с каких пор это является смягчающим обстоятельством?
...
Рейтинг: 0 / 0
Ошибка в программе на asm
    #34228026
kolobok0
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ruslan.Isbarov...
"FILO" - это уже любопытно. Заставляет подумать о Вашей компетентности в данных вопросах.

как говорил Казьма Прутков - "Где начало того конца, которым оканчивается начало и начинается конец.." (от ся добавлю) "того конца начала..."

о чём это я ? а ну да...
начнём с конца...
Вас возбудило переставленные местами буковки или Вы не согласны с объяснением работы стэка на логическом уровне ?

теперь по поводу чуши...
Ваша цитата...

Ruslan.Isbarovpush/pop - шо це таке? це работа со стеком! Более того вызывается подпрограмма hex2str. А шо в итоге? А на стек кладется адрес возврата. Содержимое IP. Це архитектурные особенности 8086. Более того, если не определить сегмент стека ваще интересная штука получится. Окажется так что содержимое регистра SS будет совпадать с содержимым регистра CS. А вот регистр SP будет содержать значение 0. О какие интересные вещи творятся! Первая же команда push уменьшит значение SP на 2 и его значение станет равным FFFEh. А теперь все вместе угадаем, какая гадость может случиться (только не в этой программе :) )??? Так что объявление сегмента стека нужно считать хорошим тоном...


дык вот, если Вы не плохо работаете с отладчиком - проверьте следующее утверждение: "никакой гадости НЕ случится!" (от того, что сегмент стэка будет равен командному, смещение нулю, код программы с глубиной стэка не будет превышать сегмента и будут отсутствовать другие сегменты - ничего плохого НЕ будет)
это первая ерунда сказанная Вами...(если Вы мне не верите - то уже рекомендовал обратиться к классикам)

другая ерунда то, что сегмент стэка отсутствует как класс в программах формата COM (о чём уже кстати прозвучало).. Так, что по поводу объявления сегмента стэка (как понацея от гадости с ним) - так же ерунду сморозили...Более того программы формата COM именно так ся и ведут (как Вы показали под отладчиком) - CS=SS=DS=ES SP=0...

хорошо, если Вас возбуждают слова "чушь" и "ерунда" - я могу принести Вам свои извенения и выразиться по другому: ВАШЕ УТВЕРЖДЕНИЕ - ЕСТЬ ЛОЖЬ...


удачи Вам
(круглый)
ЗЫ
Совет дня типа...
Вы бы сосредоточились на задачи, а не пудрили начинающему человеку мозги информацией о стэке. Ему это сейчас - мягко говоря до фонаря...
ЗЫ ЗЫ
эх-хе-хе
молодёжь, молодёжь...
...
Рейтинг: 0 / 0
Ошибка в программе на asm
    #34228203
Фотография Ruslan.Isbarov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kolobok0Вас возбудило переставленные местами буковки или Вы не согласны с объяснением работы стэка на логическом уровне ?

FILO? Да нет. Просто интересно где вы нашли такую формулировку. Вообще то LIFO. Зачем изобретать велосипед?

kolobok0

теперь по поводу чуши...
Ваша цитата...

Ruslan.Isbarovpush/pop - шо це таке? це работа со стеком! Более того вызывается подпрограмма hex2str. А шо в итоге? А на стек кладется адрес возврата. Содержимое IP. Це архитектурные особенности 8086. Более того, если не определить сегмент стека ваще интересная штука получится. Окажется так что содержимое регистра SS будет совпадать с содержимым регистра CS. А вот регистр SP будет содержать значение 0. О какие интересные вещи творятся! Первая же команда push уменьшит значение SP на 2 и его значение станет равным FFFEh. А теперь все вместе угадаем, какая гадость может случиться ( только не в этой программе :) )??? Так что объявление сегмента стека нужно считать хорошим тоном...


дык вот, если Вы не плохо работаете с отладчиком - проверьте следующее утверждение: "никакой гадости НЕ случится!" (от того, что сегмент стэка будет равен командному, смещение нулю, код программы с глубиной стэка не будет превышать сегмента и будут отсутствовать другие сегменты - ничего плохого НЕ будет)
это первая ерунда сказанная Вами...(если Вы мне не верите - то уже рекомендовал обратиться к классикам)


В этой программе ничего плохого НЕ будет. С этим я согласен. И ЭТО Я ПОДЧЕРКНУЛ В СВОЕМ УТВЕРЖДЕНИИ! Впрочем, специально для вас выделяю цветом.
Вы бы сперва внимательно почитали наши цитаты. Глядишь, вопросы сами бы собой исчезли.

kolobok0другая ерунда то, что сегмент стэка отсутствует как класс в программах формата COM (о чём уже кстати прозвучало).. Так, что по поводу объявления сегмента стэка (как понацея от гадости с ним) - так же ерунду сморозили...Более того программы формата COM именно так ся и ведут (как Вы показали под отладчиком) - CS=SS=DS=ES SP=0...


Во первых, то что я показал под отладчиком - был EXE, а не COM.
Во вторых, об этом тоже было сказано выше. Если вы еще раз внимательно почитаете тред, вы увидите, что приведенная здесь программа имеет формат EXE. И речь шла как раз таки об EXE. И это было сказано.

kolobok0хорошо, если Вас возбуждают слова "чушь" и "ерунда" - я могу принести Вам свои извенения и выразиться по другому: ВАШЕ УТВЕРЖДЕНИЕ - ЕСТЬ ЛОЖЬ...

Вам так показалось, видимо из-за собственной не внимательности.

kolobok0
ЗЫ ЗЫ
эх-хе-хе
молодёжь, молодёжь...

А вы, так понимаю, считаете себя ветераном?
...
Рейтинг: 0 / 0
20 сообщений из 20, страница 1 из 1
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Ошибка в программе на asm
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]