Консультация № 27227
04.10.2005, 16:56
0.00 руб.
0 4 4
Доброе время суток, уважаемые эксперты! Помогите пжальста разобраться с погой. Асмом занялся недавно, понять не могу , почему не работает( см приложение). Прога взята из рассылок Калашникова,
просто я решил вставить небольшую процедурку и теперь она вылетает на середине, в отладчике смотрел, хз, то же самое, где что накосячил...?
С уважением, Macshm

Приложение:
cseg segmentorg 100hstart:mov ax,3d00hmov dx,offset fileint 21hjc errormov handle,axmov bx,axmov ah,3fhmov cx,0ff00hmov dx,offset bufferint 21hpush axcall ttpop axmov ah,3ehmov bx,handleint 21hmov dx,offset messconez:mov ah,9hint 21hint 20herror:mov dx,offset mess_errjmp conezhandle dw 0mess db ‘Daaaa!$‘mess_err db ‘HeeeT!‘file db ‘aa.com‘,0,‘!$‘buffer equ $tt proc mov ah,10h int 16h rettt endpcseg endsend start

Обсуждение

давно
Посетитель
7438
7205
04.10.2005, 17:42
общий
это ответ
Здравствуйте, Macshm!
Перенеси строчку buffer equ $ перед cseg ends и будет тебе счастье...
Или подпрограммку перед handle...
Ты ж затираешь файлом свою подпрограммку...
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
Неизвестный
04.10.2005, 18:46
общий
это ответ
Здравствуйте, Macshm!
Я, конечно, не эксперт, но идея у меня есть одна.
По-моему ты вставил текст процедуры не в том месте. То есть ты написал код процедуры tt proc после того как определил переменную buffer. А так как ты читаешь из файла по адресу buffer, то у тебя просто-напросто затрется твой код процедуры tt proc!!
Посмотри что у меня получилось ( у меня правда компилятор TASM, поэтому я вставил строчку assume cs:cseg, ds:cseg, ss:cseg


Приложение:
cseg segmentassume cs:cseg, ds:cseg, ss:cseg, es:csegorg 100hstart: mov ax,3d00h mov dx,offset file int 21h jc error mov handle,ax mov bx,ax mov ah,3fh mov cx,0ff00h mov dx,offset buffer int 21h push ax call tt pop ax mov ah,3eh mov bx,handle int 21h mov dx,offset messconez: mov ah,9h int 21h int 20herror: mov dx,offset mess_err jmp coneztt proc mov ah,10h int 16h rettt endp handle dw 0 mess db ‘Daaaa!$‘ mess_err db ‘HeeeT!‘ file db ‘aa.com‘,0,‘!$‘ buffer equ $cseg endsend start
Неизвестный
05.10.2005, 00:20
общий
это ответ
Здравствуйте, Macshm! Если вы решили поэксперементировать с новыми знаниями(Процедурами), то это лудше делать в маленьких программах =), Посмотрите приложение я кое что исправил и поменял местами. Там должно всё быть понятно :)

Приложение:
cseg segmentassume CS:CSEG, DS:CSEG, ES:CSEG, SS:CSEGorg 100hstart:mov ax,3d00hmov dx,offset filenint 21hjc errormov handle,axmov bx,axmov ah,3fhmov cx,0ff00hmov dx,offset bufferint 21hpush axcall ttpop axmov ah,3ehmov bx,handleint 21hmov ah,9hmov dx,offset messint 21hconez:mov ah,10hint 16hint 20herror:mov ah,9hmov dx,offset mess_errint 21hjmp coneztt proc near mov ah,10h int 16h rettt endphandle dw 0mess db ‘Daaaa!$‘mess_err db ‘HeeeT!$‘filen db ‘aa.com‘,0buffer equ $cseg endsend start
Неизвестный
07.10.2005, 09:12
общий
это ответ
Здравствуйте, Macshm!
Для ДОС я использую TASM, но разницы вроде не много.
Во-первых:
Когда вы пишете прочитанное из файла в buffer вы затираете процедуру tt
Потому что buffer идёт как метка. Значит, если в файле aa.com вы прочитали не полный код, то результат будет непредсказуем.
{buffer equ $
tt proc
mov ah,10h
int 16h
ret
tt endp }
Если вы писали самомодифицирующийся вирус, значит идёте в правильном направлении, ну а если вы хотели вывести DAAAAA!!!! при правильном считывании
из файла, то измените в вашей программе
{
tt proc
mov ah,10h
int 16h
ret
tt endp
buffer equ $
}
И ещё, int 20h по скорости такое же как и ret, но больше на 1 байт(хотя кому это важно)
Форма ответа