IPB
ЛогинПароль:

> ПРАВИЛА РАЗДЕЛА!!!

1. Заголовок или название темы должно быть информативным
2. Все тексты программ должны помещаться в теги [CODE=asm] [/CODE]
3. Прежде чем задавать вопрос, см. "FAQ",если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно, такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Ассемблера. Исключение только с согласия модератора.
5. НЕ используйте форум для личного общения! Все, что не относиться к обсуждению темы - на PM!
6. Проверяйте программы перед тем, как выложить их на форум!!

> Структура ехе файла, Где должна находиться точка входа?
dron4ik
сообщение 23.10.2009 12:28
Сообщение #1


Бывалый
****

Группа: Пользователи
Сообщений: 318
Пол: Мужской

Репутация: -  0  +


Всем привет. Линкую программу в формат ехе и у меня выходит ошибка 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 мин.
По крайней мере программа должна демонстрировать работу строковых операций..
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
2 страниц V  1 2 >  
 Ответить  Открыть новую тему 
Ответов(1 - 19)
xds
сообщение 23.10.2009 13:12
Сообщение #2


N337
****

Группа: Пользователи
Сообщений: 737
Пол: Мужской

Репутация: -  26  +


Еще не определил стек. После загрузки образа будет SS:SP = 0.


--------------------
The idiots are winning.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
dron4ik
сообщение 23.10.2009 13:29
Сообщение #3


Бывалый
****

Группа: Пользователи
Сообщений: 318
Пол: Мужской

Репутация: -  0  +


аа..поэтому у меня в конце программы выходит ошибка какая то.

а как определить стек?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
xds
сообщение 23.10.2009 14:05
Сообщение #4


N337
****

Группа: Пользователи
Сообщений: 737
Пол: Мужской

Репутация: -  26  +


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


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

Еще твоя программа при stos и movs затирает произвольный участок памяти (вероятно, свой PSP).


--------------------
The idiots are winning.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
dron4ik
сообщение 23.10.2009 14:43
Сообщение #5


Бывалый
****

Группа: Пользователи
Сообщений: 318
Пол: Мужской

Репутация: -  0  +


вроде так.. но есть ошибка..*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).-- а как можно избавиться от произвольного затирания памяти?

Сообщение отредактировано: dron4ik - 23.10.2009 14:44
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
xds
сообщение 23.10.2009 14:46
Сообщение #6


N337
****

Группа: Пользователи
Сообщений: 737
Пол: Мужской

Репутация: -  26  +


Это не ошибка, а предупреждение. Если мешает, назови сегмент s, _stack или как угодно. На то, что он стековый, указывает модификатор stack после директивы.

Сообщение отредактировано: xds - 23.10.2009 14:47


--------------------
The idiots are winning.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
dron4ik
сообщение 23.10.2009 14:51
Сообщение #7


Бывалый
****

Группа: Пользователи
Сообщений: 318
Пол: Мужской

Репутация: -  0  +


Спасибо)
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
xds
сообщение 23.10.2009 14:51
Сообщение #8


N337
****

Группа: Пользователи
Сообщений: 737
Пол: Мужской

Репутация: -  26  +


Цитата(dron4ik @ 23.10.2009 22:43) *

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

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


--------------------
The idiots are winning.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
dron4ik
сообщение 23.10.2009 14:53
Сообщение #9


Бывалый
****

Группа: Пользователи
Сообщений: 318
Пол: Мужской

Репутация: -  0  +


спасибо.) а в роли входных данных может быть строка?

Добавлено через 1 мин.
про rep я знаю повторяет строковые команды сх раз, repe-вроде повторяет пока равно.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
xds
сообщение 23.10.2009 15:10
Сообщение #10


N337
****

Группа: Пользователи
Сообщений: 737
Пол: Мужской

Репутация: -  26  +


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

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


--------------------
The idiots are winning.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
dron4ik
сообщение 23.10.2009 15:12
Сообщение #11


Бывалый
****

Группа: Пользователи
Сообщений: 318
Пол: Мужской

Репутация: -  0  +


хм...щас я пытаюсь сделать определение строки по примеру^

;
В полях данных основного сегмента данных,
;адресуемого через 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
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
dron4ik
сообщение 23.10.2009 17:01
Сообщение #12


Бывалый
****

Группа: Пользователи
Сообщений: 318
Пол: Мужской

Репутация: -  0  +


вот вроде бы все..проверьте кому не лень 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
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
xds
сообщение 23.10.2009 17:32
Сообщение #13


N337
****

Группа: Пользователи
Сообщений: 737
Пол: Мужской

Репутация: -  26  +


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


--------------------
The idiots are winning.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
dron4ik
сообщение 23.10.2009 17:33
Сообщение #14


Бывалый
****

Группа: Пользователи
Сообщений: 318
Пол: Мужской

Репутация: -  0  +


ну вот надеюсь финальная версия... 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.---ничего не понял((((

 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
xds
сообщение 23.10.2009 17:35
Сообщение #15


N337
****

Группа: Пользователи
Сообщений: 737
Пол: Мужской

Репутация: -  26  +


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

Не. Где загрузка значений в DS и ES?


--------------------
The idiots are winning.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
dron4ik
сообщение 23.10.2009 17:38
Сообщение #16


Бывалый
****

Группа: Пользователи
Сообщений: 318
Пол: Мужской

Репутация: -  0  +


xds..я совсем запутался((не пойму где и чего не хватает.(((
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
xds
сообщение 23.10.2009 17:45
Сообщение #17


N337
****

Группа: Пользователи
Сообщений: 737
Пол: Мужской

Репутация: -  26  +


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


--------------------
The idiots are winning.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 23.10.2009 17:46
Сообщение #18


Гость






Цитата
незнаю правильно ли работает
Это тебе лучше знать. Что оно ДОЛЖНО делать - ты не озвучил, посему все вышесказанное - не более как флуд. Да, оно теперь компилируется, и что? Я тебе тысячу программ приведу, которые компилируются, а поставленную задачу не решают. И они ВСЕ - неправильные. Как, возможно, и твоя.
 К началу страницы 
+ Ответить 
dron4ik
сообщение 23.10.2009 17:49
Сообщение #19


Бывалый
****

Группа: Пользователи
Сообщений: 318
Пол: Мужской

Репутация: -  0  +


программа должна демонстрировать работу со строковыми операциями.

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


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

 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
xds
сообщение 23.10.2009 17:57
Сообщение #20


N337
****

Группа: Пользователи
Сообщений: 737
Пол: Мужской

Репутация: -  26  +


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

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

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


--------------------
The idiots are winning.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

2 страниц V  1 2 >
 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 



- Текстовая версия 10.11.2024 13:39
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"