Помощь - Поиск - Пользователи - Календарь
Полная версия: Структура ехе файла
Форум «Всё о Паскале» > Современный Паскаль и другие языки > Ассемблер
dron4ik
Всем привет. Линкую программу в формат ехе и у меня выходит ошибка No program entry point. перевел на русский значит что точку входа не обнаружило. посоветуйте где писать эту точку входа.




CODE    SEGMENT 

ASSUME CS:CODE,DS:CODE,ES:CODE

EXBYTE LABEL BYTE

EXWORD LABEL WORD

EXBYTE1 LABEL BYTE

EXWORD1 LABEL WORD

Main proc

LODS EXBYTE ; Загрузка AL из DS:SI

LODS EXWORD ; Загрузка AX из DS:SI

LODSB ; Загрузка AL из DS:SI

STOS EXBYTE ; Сохранение AL в ES:DI

STOS EXWORD ; Сохранение AX в ES:DI

STOSW ; Сохранение AX в ES:DI

REP STOSB ; Сохранение AL в ES:DI в цикле CX раз



MOVS EXBYTE1, EXBYTE ; Пересылка байта [ES:DI] <- [DS:SI]

MOVS EXWORD1, EXWORD ; Пересылка слова [ES:DI] <- [DS:SI]

MOVSB ; Пересылка байта [ES:DI] <- [DS:SI]


REP MOVSW ; Пересылка CX слов [ES:DI] <- [DS:SI]



SCAS EXBYTE1 ; Сравнение AL с [ES:DI]

REPE SCASB ; Сравнение AL с [ES:DI] пока равно

REPNE SCASW ; Сравнение AX с [ES:DI] пока не равно



CMPS EXWORD, EXWORD1 ; Сравнение слова [DS:SI] с [ES:DI]

REPE CMPSW ; Сравнение слов [DS:SI] с [ES:DI] пока

; равно в цикле CX раз
REPNE CMPSB ; Сравнение байт [DS:SI] с [ES:DI] пока

; не равно в цикле CX раз
Main endp
CODE ENDS

END


Добавлено через 13 мин.
Удивительно,но вроде сделал сам1)

Добавлено через 49 сек.
Надеюсь вход сделал правильно..




CODES    SEGMENT  'CODE'

ASSUME CS:CODES,DS:CODES,ES:CODES

EXBYTE LABEL BYTE

EXWORD LABEL WORD

EXBYTE1 LABEL BYTE

EXWORD1 LABEL WORD

Main proc

LODS EXBYTE ; Загрузка AL из DS:SI

LODS EXWORD ; Загрузка AX из DS:SI

LODSB ; Загрузка AL из DS:SI

STOS EXBYTE ; Сохранение AL в ES:DI

STOS EXWORD ; Сохранение AX в ES:DI

STOSW ; Сохранение AX в ES:DI

REP STOSB ; Сохранение AL в ES:DI в цикле CX раз



MOVS EXBYTE1, EXBYTE ; Пересылка байта [ES:DI] <- [DS:SI]

MOVS EXWORD1, EXWORD ; Пересылка слова [ES:DI] <- [DS:SI]

MOVSB ; Пересылка байта [ES:DI] <- [DS:SI]


REP MOVSW ; Пересылка CX слов [ES:DI] <- [DS:SI]



SCAS EXBYTE1 ; Сравнение AL с [ES:DI]

REPE SCASB ; Сравнение AL с [ES:DI] пока равно

REPNE SCASW ; Сравнение AX с [ES:DI] пока не равно



CMPS EXWORD, EXWORD1 ; Сравнение слова [DS:SI] с [ES:DI]

REPE CMPSW ; Сравнение слов [DS:SI] с [ES:DI] пока

; равно в цикле CX раз
REPNE CMPSB ; Сравнение байт [DS:SI] с [ES:DI] пока

; не равно в цикле CX раз
Main endp
CODES ENDS

END Main


Добавлено через 49 сек.
По чаще надо оказывается лекции открывать smile.gif

Добавлено через 3 мин.
По крайней мере программа должна демонстрировать работу строковых операций..
xds
Еще не определил стек. После загрузки образа будет SS:SP = 0.
dron4ik
аа..поэтому у меня в конце программы выходит ошибка какая то.

а как определить стек?
xds
В полной нотации (с директивами segment) в tasm вроде бы так:
stack	segment stack
db 2048 dup(?)
ends


Ставить последним в программе (перед end Main).

Еще твоя программа при stos и movs затирает произвольный участок памяти (вероятно, свой PSP).
dron4ik
вроде так.. но есть ошибка..*Warning* 40.asm(66) Reserved word used as symbol: STACK



CODES    SEGMENT  'CODE'

ASSUME CS:CODES,DS:CODES,ES:CODES

EXBYTE LABEL BYTE

EXWORD LABEL WORD

EXBYTE1 LABEL BYTE

EXWORD1 LABEL WORD

Main proc

LODS EXBYTE ; Загрузка AL из DS:SI

LODS EXWORD ; Загрузка AX из DS:SI

LODSB ; Загрузка AL из DS:SI

STOS EXBYTE ; Сохранение AL в ES:DI

STOS EXWORD ; Сохранение AX в ES:DI

STOSW ; Сохранение AX в ES:DI

REP STOSB ; Сохранение AL в ES:DI в цикле CX раз



MOVS EXBYTE1, EXBYTE ; Пересылка байта [ES:DI] <- [DS:SI]

MOVS EXWORD1, EXWORD ; Пересылка слова [ES:DI] <- [DS:SI]

MOVSB ; Пересылка байта [ES:DI] <- [DS:SI]


REP MOVSW ; Пересылка CX слов [ES:DI] <- [DS:SI]



SCAS EXBYTE1 ; Сравнение AL с [ES:DI]

REPE SCASB ; Сравнение AL с [ES:DI] пока равно

REPNE SCASW ; Сравнение AX с [ES:DI] пока не равно



CMPS EXWORD, EXWORD1 ; Сравнение слова [DS:SI] с [ES:DI]

REPE CMPSW ; Сравнение слов [DS:SI] с [ES:DI] пока

; равно в цикле CX раз
REPNE CMPSB ; Сравнение байт [DS:SI] с [ES:DI] пока

; не равно в цикле CX раз
Mov ax, 4c00h
int 21h
Main endp
CODES ENDS

stack segment stack
db 2048 dup(?)
ends

END Main


Добавлено через 1 мин.
Еще твоя программа при stos и movs затирает произвольный участок памяти (вероятно, свой PSP).-- а как можно избавиться от произвольного затирания памяти?
xds
Это не ошибка, а предупреждение. Если мешает, назови сегмент s, _stack или как угодно. На то, что он стековый, указывает модификатор stack после директивы.
dron4ik
Спасибо)
xds
Цитата(dron4ik @ 23.10.2009 22:43) *

а как можно избавиться от произвольного затирания памяти?

Добавить входные данные и буфер для выходных, загрузить указатели на них в ds:si и es:di. Так же, почитать про префиксы rep и repe — про то, сколько они раз повторяют команду.
dron4ik
спасибо.) а в роли входных данных может быть строка?

Добавлено через 1 мин.
про rep я знаю повторяет строковые команды сх раз, repe-вроде повторяет пока равно.
xds
Цитата
спасибо.) а в роли входных данных может быть строка?
Какая-нибудь цепочка байтов — «строка» в терминах соответствующих инструкций — определенная через директиву db. Можно для наглядности что-нибудь символьное.

Цитата
про rep я знаю повторяет строковые команды сх раз, repe-вроде повторяет пока равно.
А cx у тебя чему равен? smile.gif repe повторяет пока не равно, но cx раз максимум.
dron4ik
хм...щас я пытаюсь сделать определение строки по примеру^

;
В полях данных основного сегмента данных,
;адресуемого через DS:
txt db 'Урок 1' ;Пересылаемая строка
txt_len equ S-txt ;Ee длина
;В 'полях данных дополнительного сегмента данных,
;адресуемого через ES :
string db 80 dup (' ')
;В программном сегменте:
lea SI,txt ;DS:SI -> txt
lea DI,string+10.;ES:DI -> string+10
сld ;Движение по строке вперед
mov CX,txt_len ;Столько байтов переслать
rep movsb ;Пересылка


Добавлено через 7 мин.
Сделал..но ерунда какая то.. даже экзешник не создало при линковании..


Добавлено через 1 мин.
           


CODES SEGMENT 'CODE'

ASSUME CS:CODES,DS:CODES,ES:CODES

EXBYTE LABEL BYTE

EXWORD LABEL WORD

EXBYTE1 LABEL BYTE

EXWORD1 LABEL WORD
txt db '1234567'
txt_len equ S-txt
string db 80 dup (' ')


Main proc

LODS EXBYTE ; Загрузка AL из DS:SI

LODS EXWORD ; Загрузка AX из DS:SI

LODSB ; Загрузка AL из DS:SI
mov ax, 1111
STOS EXBYTE ; Сохранение AL в ES:DI

STOS EXWORD ; Сохранение AX в ES:DI

STOSW ; Сохранение AX в ES:DI
lea SI,txt
lea DI,string+10
сld
mov CX,txt_len
rep STOSB





MOVS EXBYTE1, EXBYTE ; Пересылка байта [ES:DI] <- [DS:SI]

MOVS EXWORD1, EXWORD ; Пересылка слова [ES:DI] <- [DS:SI]

MOVSB ; Пересылка байта [ES:DI] <- [DS:SI]


REP MOVSW ; Пересылка CX слов [ES:DI] <- [DS:SI]



SCAS EXBYTE1 ; Сравнение AL с [ES:DI]

REPE SCASB ; Сравнение AL с [ES:DI] пока равно

REPNE SCASW ; Сравнение AX с [ES:DI] пока не равно



CMPS EXWORD, EXWORD1 ; Сравнение слова [DS:SI] с [ES:DI]

REPE CMPSW ; Сравнение слов [DS:SI] с [ES:DI] пока

; равно в цикле CX раз
REPNE CMPSB ; Сравнение байт [DS:SI] с [ES:DI] пока

; не равно в цикле CX раз
Mov ax, 4c00h
int 21h
Main endp
CODES ENDS

S_stack segment stack
db 2048 dup(?)
ends

END Main


Добавлено через 8 мин.
вот исправил , хотя бы линкуется.. smile.gif но незнаю правильно ли работает..





CODES    SEGMENT  'CODE'

ASSUME CS:CODES,DS:CODES,ES:CODES

EXBYTE LABEL BYTE

EXWORD LABEL WORD

EXBYTE1 LABEL BYTE

EXWORD1 LABEL WORD
txt db '1234567'
string db 80 dup (' ')


Main proc

LODS EXBYTE ; Загрузка AL из DS:SI

LODS EXWORD ; Загрузка AX из DS:SI

LODSB ; Загрузка AL из DS:SI
mov ax, 1111
STOS EXBYTE ; Сохранение AL в ES:DI

STOS EXWORD ; Сохранение AX в ES:DI

STOSW ; Сохранение AX в ES:DI
lea SI,txt
lea DI,string
mov CX,7
rep STOSB





MOVS EXBYTE1, EXBYTE ; Пересылка байта [ES:DI] <- [DS:SI]

MOVS EXWORD1, EXWORD ; Пересылка слова [ES:DI] <- [DS:SI]

MOVSB ; Пересылка байта [ES:DI] <- [DS:SI]


REP MOVSW ; Пересылка CX слов [ES:DI] <- [DS:SI]



SCAS EXBYTE1 ; Сравнение AL с [ES:DI]

REPE SCASB ; Сравнение AL с [ES:DI] пока равно

REPNE SCASW ; Сравнение AX с [ES:DI] пока не равно



CMPS EXWORD, EXWORD1 ; Сравнение слова [DS:SI] с [ES:DI]

REPE CMPSW ; Сравнение слов [DS:SI] с [ES:DI] пока

; равно в цикле CX раз
REPNE CMPSB ; Сравнение байт [DS:SI] с [ES:DI] пока

; не равно в цикле CX раз
Mov ax, 4c00h
int 21h
Main endp
CODES ENDS

S_stack segment stack
db 2048 dup(?)
ends

END Main
dron4ik
вот вроде бы все..проверьте кому не лень smile.gif




CODES    SEGMENT  'CODE'
ASSUME CS:CODES,DS:CODES,ES:CODES
EXBYTE LABEL BYTE
EXWORD LABEL WORD
EXBYTE1 LABEL BYTE
EXWORD1 LABEL WORD

Source db '1234567 '
string db 80 dup (' ')
txt1 db ' ПРИМЕР$'
txt2 db 'ANDREW$ '

Main proc
LODS EXBYTE ; Загрузка AL из DS:SI
LODS EXWORD ; Загрузка AX из DS:SI
LODSB ; Загрузка AL из DS:SI


mov ax, 1111
STOS EXBYTE ; Сохранение AL в ES:DI
STOS EXWORD ; Сохранение AX в ES:DI
lea SI,Source
lea DI,string
mov CX,7
rep STOSB




lea SI,txt1
lea DI,txt2

MOVS txt1, txt2 ; Пересылка байта [ES:DI] <- [DS:SI]

mov cx,6
rep MOVSB ; Пересылка байта [ES:DI] <- [DS:SI]
mov cx,6
REP MOVSW ; Пересылка CX слов [ES:DI] <- [DS:SI]



SCAS EXBYTE1 ; Сравнение AL с [ES:DI]

REPE SCASB ; Сравнение AL с [ES:DI] пока равно

REPNE SCASW ; Сравнение AX с [ES:DI] пока не равно



CMPS EXWORD, EXWORD1 ; Сравнение слова [DS:SI] с [ES:DI]

REPE CMPSW ; Сравнение слов [DS:SI] с [ES:DI] пока

; равно в цикле CX раз
REPNE CMPSB ; Сравнение байт [DS:SI] с [ES:DI] пока

; не равно в цикле CX раз
Mov ax, 4c00h
int 21h
Main endp
CODES ENDS

S_stack segment stack
db 2048 dup(?)
ends

END Main
xds
Не инициализировал DS и ES. В момент запуска они указывают на PSP. Данные у тебя в сегменте кода — на него после запуска указывает только CS.
dron4ik
ну вот надеюсь финальная версия... smile.gif





CODES SEGMENT 'CODE'
ASSUME CS:CODES,DS:CODES,ES:CODES
EXBYTE LABEL BYTE
EXWORD LABEL WORD
EXBYTE1 LABEL BYTE
EXWORD1 LABEL WORD

Source db '1234567 '
string db 80 dup (' ')
str1 db ' 123456'
str2 db 'ANDREW '

Main proc
LODS EXBYTE ; Загрузка AL из DS:SI
LODS EXWORD ; Загрузка AX из DS:SI
LODSB ; Загрузка AL из DS:SI


mov ax, 1111
STOS EXBYTE ; Сохранение AL в ES:DI
STOS EXWORD ; Сохранение AX в ES:DI
mov CX,3
rep STOSB




lea SI,str1
lea DI,str2
MOVS str1, str2 ; Пересылка байта [ES:DI] <- [DS:SI]
mov cx,6
rep MOVSB ; Пересылка байта [ES:DI] <- [DS:SI]
mov cx,3
REP MOVSW ; Пересылка CX слов [ES:DI] <- [DS:SI]


SCAS EXBYTE1 ; Сравнение AL с [ES:DI]
REPE SCASB ; Сравнение AL с [ES:DI] пока равно
REPNE SCASW ; Сравнение AX с [ES:DI] пока не равно

CMPS EXWORD, EXWORD1 ; Сравнение слова [DS:SI] с [ES:DI]
REPE CMPSW ; Сравнение слов [DS:SI] с [ES:DI] пока
REPNE CMPSB ; Сравнение байт [DS:SI] с [ES:DI] пока
; не равно в цикле CX раз
Mov ax, 4c00h
int 21h
Main endp
CODES ENDS

S_stack segment stack
db 2048 dup(?)
ends

END Main


Добавлено через 2 мин.
Не инициализировал DS и ES. В момент запуска они указывают на PSP. Данные у тебя в сегменте кода — на него после запуска указывает только CS.---ничего не понял((((

xds
Цитата
ну вот надеюсь финальная версия... smile.gif

Не. Где загрузка значений в DS и ES?
dron4ik
xds..я совсем запутался((не пойму где и чего не хватает.(((
xds
Не хватает копирования значения CS в DS и ES. Данные у тебя лежат там же, где и код. Значит, адреса меток считаются относительно того же сегмента. Но перед перед запуском программы ОС записывает в DS и ES значение, отличное от значения CS. Директива ASSUME не генерирует кода инициализации сегментных регистров — она нужна совсем для других целей.
volvo
Цитата
незнаю правильно ли работает
Это тебе лучше знать. Что оно ДОЛЖНО делать - ты не озвучил, посему все вышесказанное - не более как флуд. Да, оно теперь компилируется, и что? Я тебе тысячу программ приведу, которые компилируются, а поставленную задачу не решают. И они ВСЕ - неправильные. Как, возможно, и твоя.
dron4ik
программа должна демонстрировать работу со строковыми операциями.

Не хватает копирования значения CS в DS и ES. Данные у тебя лежат там же, где и код. Значит, адреса меток считаются относительно того же сегмента. Но перед перед запуском программы ОС записывает в DS и ES значение, отличное от значения CS. Директива ASSUME не генерирует кода инициализации сегментных регистров — она нужна совсем для других целей.-- а как это сейчас исправить?(


Добавлено через 6 мин.
т.е. надо разделить прогу на сегменты?

xds
Цитата
демонстрировать работу

Как это у тебя реализуется?

Добавлено через 1 мин.
После точки входа:
mov ax,cs
mov ds,ax
mov es,ax
dron4ik
т.е. показать в отладчике как работают строковые команды.

Добавлено через 1 мин.
кто куда пересылается, кто куда загружается и т.д.
xds
Цитата
т.е. показать в отладчике как работают строковые команды.

Ясно. А ты разбираешься, как самому себе показать?
dron4ik
можно сказать фундамент, элемементарные операции с этими командами
xds
Не, не. Я про то, чтоб ты сам проверил: работает или нет. Если бы проверял, то должен был заметить, что пересылается мусор.
dron4ik
я в теории не плохо знаю как работает..а так если б четко знал я бы сдесь не был бы..

Добавлено через 4 мин.
я заметил что пересылается что то не то..

Добавлено через 3 мин.
Добавил. после точки входа mov ax,cs
mov ds,ax
mov es,ax


CODES    SEGMENT  'CODE'
mov ax,cs
mov ds,ax
mov es,ax

ASSUME CS:CODES,DS:CODES,ES:CODES
EXBYTE LABEL BYTE
EXWORD LABEL WORD
EXBYTE1 LABEL BYTE
EXWORD1 LABEL WORD

Source db '1234567 '
string db 80 dup (' ')
str1 db ' 123456'
str2 db 'ANDREW '

Main proc
LODS EXBYTE ; Загрузка AL из DS:SI
LODS EXWORD ; Загрузка AX из DS:SI
LODSB ; Загрузка AL из DS:SI


mov ax, 1111
STOS EXBYTE ; Сохранение AL в ES:DI
STOS EXWORD ; Сохранение AX в ES:DI
mov CX,3
rep STOSB




lea SI,str1
lea DI,str2
MOVS str1, str2 ; Пересылка байта [ES:DI] <- [DS:SI]
mov cx,6
rep MOVSB ; Пересылка байта [ES:DI] <- [DS:SI]
mov cx,3
REP MOVSW ; Пересылка CX слов [ES:DI] <- [DS:SI]


SCAS EXBYTE1 ; Сравнение AL с [ES:DI]
REPE SCASB ; Сравнение AL с [ES:DI] пока равно
REPNE SCASW ; Сравнение AX с [ES:DI] пока не равно

CMPS EXWORD, EXWORD1 ; Сравнение слова [DS:SI] с [ES:DI]
REPE CMPSW ; Сравнение слов [DS:SI] с [ES:DI] пока
REPNE CMPSB ; Сравнение байт [DS:SI] с [ES:DI] пока
; не равно в цикле CX раз
Mov ax, 4c00h
int 21h
Main endp
CODES ENDS

S_stack segment stack
db 2048 dup(?)
ends

END Main
xds
Разбирай по-порядку по одной команде. Когда с одной разберешься и она будет работать, как полагается — переходи к следующей. А то ты кучу кода написал, а толку — ноль.
dron4ik
блин..ниче не правильно да?
xds
Короче, не туда поставил инициализацию сегментов smile.gif Хех, это уже другая история... Я — спать.

Ищи примеры, статьи и разбирай. Не читать же мне лекцию про x86 real mode, DOS и пр...
dron4ik
http://podgoretsky.com/ftp/docs/Asm/AsmBra...4-8-1.html---ну сам Бредли мог ошибиться в примере?
xds
Цитата
http://podgoretsky.com/ftp/docs/Asm/AsmBra...4-8-1.html---ну сам Бредли мог ошибиться в примере?
Это не законченная программа, которая что-то демонстрирует, а просто список всех инструкций работы со строками.

Ок. Я напишу тебе «болванку», а ты сам ее дополни недостающими инструкциями.
dron4ik
Спасибо большое тебе xds)) попробую щас разобраться))
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.