Всем привет. Линкую программу в формат ехе и у меня выходит ошибка 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
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
Еще не определил стек. После загрузки образа будет SS:SP = 0.
аа..поэтому у меня в конце программы выходит ошибка какая то.
а как определить стек?
В полной нотации (с директивами segment) в tasm вроде бы так:
stack segment stack
db 2048 dup(?)
ends
вроде так.. но есть ошибка..*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
Это не ошибка, а предупреждение. Если мешает, назови сегмент s, _stack или как угодно. На то, что он стековый, указывает модификатор stack после директивы.
Спасибо)
спасибо.) а в роли входных данных может быть строка?
Добавлено через 1 мин.
про rep я знаю повторяет строковые команды сх раз, repe-вроде повторяет пока равно.
хм...щас я пытаюсь сделать определение строки по примеру^
;
В полях данных основного сегмента данных,
;адресуемого через 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 ;Пересылка
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
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
вот вроде бы все..проверьте кому не лень
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
Не инициализировал DS и ES. В момент запуска они указывают на PSP. Данные у тебя в сегменте кода — на него после запуска указывает только CS.
ну вот надеюсь финальная версия...
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
xds..я совсем запутался((не пойму где и чего не хватает.(((
Не хватает копирования значения CS в DS и ES. Данные у тебя лежат там же, где и код. Значит, адреса меток считаются относительно того же сегмента. Но перед перед запуском программы ОС записывает в DS и ES значение, отличное от значения CS. Директива ASSUME не генерирует кода инициализации сегментных регистров — она нужна совсем для других целей.
программа должна демонстрировать работу со строковыми операциями.
Не хватает копирования значения CS в DS и ES. Данные у тебя лежат там же, где и код. Значит, адреса меток считаются относительно того же сегмента. Но перед перед запуском программы ОС записывает в DS и ES значение, отличное от значения CS. Директива ASSUME не генерирует кода инициализации сегментных регистров — она нужна совсем для других целей.-- а как это сейчас исправить?(
Добавлено через 6 мин.
т.е. надо разделить прогу на сегменты?
mov ax,cs
mov ds,ax
mov es,ax
т.е. показать в отладчике как работают строковые команды.
Добавлено через 1 мин.
кто куда пересылается, кто куда загружается и т.д.
можно сказать фундамент, элемементарные операции с этими командами
Не, не. Я про то, чтоб ты сам проверил: работает или нет. Если бы проверял, то должен был заметить, что пересылается мусор.
я в теории не плохо знаю как работает..а так если б четко знал я бы сдесь не был бы..
Добавлено через 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
Разбирай по-порядку по одной команде. Когда с одной разберешься и она будет работать, как полагается — переходи к следующей. А то ты кучу кода написал, а толку — ноль.
блин..ниче не правильно да?
Короче, не туда поставил инициализацию сегментов Хех, это уже другая история... Я — спать.
Ищи примеры, статьи и разбирай. Не читать же мне лекцию про x86 real mode, DOS и пр...
http://podgoretsky.com/ftp/docs/Asm/AsmBradly/4/4-8-1.html---ну сам Бредли мог ошибиться в примере?
Спасибо большое тебе xds)) попробую щас разобраться))