![]() |
1. Заголовок или название темы должно быть информативным
2. Все тексты программ должны помещаться в теги [CODE=asm] [/CODE]
3. Прежде чем задавать вопрос, см. "FAQ",если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно, такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Ассемблера. Исключение только с согласия модератора.
5. НЕ используйте форум для личного общения! Все, что не относиться к обсуждению темы - на PM!
6. Проверяйте программы перед тем, как выложить их на форум!!
![]() ![]() |
![]() |
dron4ik |
![]()
Сообщение
#1
|
![]() Бывалый ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 318 Пол: Мужской Репутация: ![]() ![]() ![]() |
Всем привет. Линкую программу в формат ехе и у меня выходит ошибка 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 сек. По чаще надо оказывается лекции открывать ![]() Добавлено через 3 мин. По крайней мере программа должна демонстрировать работу строковых операций.. |
xds |
![]()
Сообщение
#2
|
![]() N337 ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 737 Пол: Мужской Репутация: ![]() ![]() ![]() |
Еще не определил стек. После загрузки образа будет SS:SP = 0.
-------------------- The idiots are winning.
|
dron4ik |
![]()
Сообщение
#3
|
![]() Бывалый ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 318 Пол: Мужской Репутация: ![]() ![]() ![]() |
аа..поэтому у меня в конце программы выходит ошибка какая то.
а как определить стек? |
xds |
![]()
Сообщение
#4
|
![]() N337 ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 737 Пол: Мужской Репутация: ![]() ![]() ![]() |
В полной нотации (с директивами segment) в tasm вроде бы так:
stack segment stack
db 2048 dup(?)
ends
Ставить последним в программе (перед end Main). Еще твоя программа при stos и movs затирает произвольный участок памяти (вероятно, свой PSP). -------------------- The idiots are winning.
|
dron4ik |
![]()
Сообщение
#5
|
![]() Бывалый ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 318 Пол: Мужской Репутация: ![]() ![]() ![]() |
вроде так.. но есть ошибка..*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 |
xds |
![]()
Сообщение
#6
|
![]() N337 ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 737 Пол: Мужской Репутация: ![]() ![]() ![]() |
Это не ошибка, а предупреждение. Если мешает, назови сегмент s, _stack или как угодно. На то, что он стековый, указывает модификатор stack после директивы.
Сообщение отредактировано: xds - 23.10.2009 14:47 -------------------- The idiots are winning.
|
dron4ik |
![]()
Сообщение
#7
|
![]() Бывалый ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 318 Пол: Мужской Репутация: ![]() ![]() ![]() |
Спасибо)
|
xds |
![]()
Сообщение
#8
|
![]() N337 ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 737 Пол: Мужской Репутация: ![]() ![]() ![]() |
а как можно избавиться от произвольного затирания памяти? Добавить входные данные и буфер для выходных, загрузить указатели на них в ds:si и es:di. Так же, почитать про префиксы rep и repe — про то, сколько они раз повторяют команду. -------------------- The idiots are winning.
|
dron4ik |
![]()
Сообщение
#9
|
![]() Бывалый ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 318 Пол: Мужской Репутация: ![]() ![]() ![]() |
спасибо.) а в роли входных данных может быть строка?
Добавлено через 1 мин. про rep я знаю повторяет строковые команды сх раз, repe-вроде повторяет пока равно. |
xds |
![]()
Сообщение
#10
|
![]() N337 ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 737 Пол: Мужской Репутация: ![]() ![]() ![]() |
Цитата спасибо.) а в роли входных данных может быть строка? Какая-нибудь цепочка байтов — «строка» в терминах соответствующих инструкций — определенная через директиву db. Можно для наглядности что-нибудь символьное.Цитата про rep я знаю повторяет строковые команды сх раз, repe-вроде повторяет пока равно. А cx у тебя чему равен? ![]() -------------------- The idiots are winning.
|
dron4ik |
![]()
Сообщение
#11
|
![]() Бывалый ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 318 Пол: Мужской Репутация: ![]() ![]() ![]() |
хм...щас я пытаюсь сделать определение строки по примеру^
; В полях данных основного сегмента данных,
;адресуемого через 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 мин. вот исправил , хотя бы линкуется.. ![]() 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 |
![]()
Сообщение
#12
|
![]() Бывалый ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 318 Пол: Мужской Репутация: ![]() ![]() ![]() |
вот вроде бы все..проверьте кому не лень
![]() 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 |
![]()
Сообщение
#13
|
![]() N337 ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 737 Пол: Мужской Репутация: ![]() ![]() ![]() |
Не инициализировал DS и ES. В момент запуска они указывают на PSP. Данные у тебя в сегменте кода — на него после запуска указывает только CS.
-------------------- The idiots are winning.
|
dron4ik |
![]()
Сообщение
#14
|
![]() Бывалый ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 318 Пол: Мужской Репутация: ![]() ![]() ![]() |
ну вот надеюсь финальная версия...
![]()
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 |
![]()
Сообщение
#15
|
![]() N337 ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 737 Пол: Мужской Репутация: ![]() ![]() ![]() |
Цитата ну вот надеюсь финальная версия... smile.gif Не. Где загрузка значений в DS и ES? -------------------- The idiots are winning.
|
dron4ik |
![]()
Сообщение
#16
|
![]() Бывалый ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 318 Пол: Мужской Репутация: ![]() ![]() ![]() |
xds..я совсем запутался((не пойму где и чего не хватает.(((
|
xds |
![]()
Сообщение
#17
|
![]() N337 ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 737 Пол: Мужской Репутация: ![]() ![]() ![]() |
Не хватает копирования значения CS в DS и ES. Данные у тебя лежат там же, где и код. Значит, адреса меток считаются относительно того же сегмента. Но перед перед запуском программы ОС записывает в DS и ES значение, отличное от значения CS. Директива ASSUME не генерирует кода инициализации сегментных регистров — она нужна совсем для других целей.
-------------------- The idiots are winning.
|
volvo |
![]()
Сообщение
#18
|
Гость ![]() |
Цитата незнаю правильно ли работает Это тебе лучше знать. Что оно ДОЛЖНО делать - ты не озвучил, посему все вышесказанное - не более как флуд. Да, оно теперь компилируется, и что? Я тебе тысячу программ приведу, которые компилируются, а поставленную задачу не решают. И они ВСЕ - неправильные. Как, возможно, и твоя. |
dron4ik |
![]()
Сообщение
#19
|
![]() Бывалый ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 318 Пол: Мужской Репутация: ![]() ![]() ![]() |
программа должна демонстрировать работу со строковыми операциями.
Не хватает копирования значения CS в DS и ES. Данные у тебя лежат там же, где и код. Значит, адреса меток считаются относительно того же сегмента. Но перед перед запуском программы ОС записывает в DS и ES значение, отличное от значения CS. Директива ASSUME не генерирует кода инициализации сегментных регистров — она нужна совсем для других целей.-- а как это сейчас исправить?( Добавлено через 6 мин. т.е. надо разделить прогу на сегменты? |
xds |
![]()
Сообщение
#20
|
![]() N337 ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 737 Пол: Мужской Репутация: ![]() ![]() ![]() |
Цитата демонстрировать работу Как это у тебя реализуется? Добавлено через 1 мин. После точки входа: mov ax,cs
mov ds,ax
mov es,ax
-------------------- The idiots are winning.
|
![]() ![]() |
![]() |
Текстовая версия | 29.07.2025 8:09 |