бегущая строка под Dos
Модератор: Andy
помогите плз с задачкой:
Составить программу для ввода с клавиатуры строки символов. Записать строку в буфер buf и организовать вывод бегущей строки.
Прога должна работать под управлением MS DOS.
Инструментальная среда TASM 5.10 (MASM 6.11).
спс.
Составить программу для ввода с клавиатуры строки символов. Записать строку в буфер buf и организовать вывод бегущей строки.
Прога должна работать под управлением MS DOS.
Инструментальная среда TASM 5.10 (MASM 6.11).
спс.
Код: Выделить всё
.model small
.386
.stack
.code
jmp @start
buf db 255, 0, 255 dup (0)
s_inputstring db 'Input string : $'
s_keypress db 0Dh, 0Ah, 'Press any key to exit$'
log_position dw 0
max_position dw 0
out_position dw 12
; ===================== Waiting timer
WaitTimer proc near
push es
push ax
xor ax, ax
mov es, ax
mov ax, es:[46Ch]
@waiting:
cmp ax, es:[46Ch]
jz @waiting
pop ax
pop es
ret
WaitTimer endp
; ===================== Running string output
OutRunString proc near
pusha
push es
cld
mov ax, 0B800h
mov es, ax
mov ax, Out_Position
imul ax, ax, 160 ; Calculating offset
mov di, ax
mov si, ax
mov cx, 80
mov ax, 03420h
rep stosw ; Filling whole line by spaces
mov cx, 80 ; Characters to end of line
mov di, si
mov si, offset Buf + 2 ; First char of string
movzx bp, [si-1]
add bp, si ; Last char of string + 1
mov ax, Log_Position
cmp ax, cx
jnc @no_offset ; If position >= 80 then no need to offset string
sub cx, ax
add di, cx
add di, cx
mov cx, ax ; Calc offset and length
jmp short @outstr
@no_offset:
sub ax, cx
add si, ax ; Calc first output character
@outstr:
jcxz @outend
mov ah, 034h
mov al, [si]
stosw ; Out character
inc si
cmp si, bp ; If end of line or end of string then exit
jz @outend
dec cx
jmp short @outstr
@outend:
pop es
popa
retn
OutRunString endp
; ========================= MAIN CODE ================================
@start:
push cs
pop ds
mov ax, 3 ; Videomode 80x25
int 10h
mov dx, offset s_inputstring
mov ah, 9
int 21h
mov ah, 0Ah
mov dx, offset buf
int 21h ; Buffered input
mov dx, offset s_keypress
mov ah, 9
int 21h
movzx ax, byte ptr buf + 1
add ax, 80
mov Max_Position, ax
@work:
call WaitTimer ; Waiting 1/18 sec.
inc Log_Position
mov ax, Log_Position
cmp ax, Max_Position ; If LogPos > MaxPos then LogPos = 0
jnz @skip
mov Log_Position, 0
@skip:
call OutRunString ; Out running string
mov ah, 0Bh
int 21h
or al, al ; If not key pressed, then continue
jz @work
mov ah, 0Ch
int 21h ; Flush key buffer
mov ax, 4C00h
int 21h
end
It's a long way to the top if you wanna rock'n'roll
Огромное спасибо! Очень выручил 
ток возникает при линке ошибка:
Fatal: No program entry point
((
Не подскажешь почему?

ток возникает при линке ошибка:
Fatal: No program entry point
((
Не подскажешь почему?
Это зависит от компилятора, по идее Entry Point в этой программе по умолчанию 0000:0000 - но более старшие версии могут поругаться, что она не задана - в любом случае фатальной ошибки быть не должно
It's a long way to the top if you wanna rock'n'roll
Может, делу поможет замена самого последнего end на:
end @start
или
end start
Я в своих программках именно так писал. Правла, у меня метки отчего-то всегда были без "собачек" первым символом, т.примерно так:
end @start
или
end start
Я в своих программках именно так писал. Правла, у меня метки отчего-то всегда были без "собачек" первым символом, т.примерно так:
Код: Выделить всё
.model tiny
.code
ORG 100h
start:
;; Do something here ...
end start
Еще раз огромное спасибо!!))
Помогло) просто в конце исправил на end @start
Очень вам признателен.
Помогло) просто в конце исправил на end @start
Очень вам признателен.
Посмотел чуть повнимательнее на свои тексты и на текст, выложенный somewhere. У него первым оператором (после строки .code)стоит jmp @start.fron писал(а):Еще раз огромное спасибо!!))
Помогло) просто в конце исправил на end @start
Очень вам признателен.
У меня всегда структура исх.текста была следующая:
Код: Выделить всё
.model tiny
.code
ORG 100h
start:
jmp begin
;; Здесь размещались различные процедуры и данные
begin:
;; Здесь начиналась собственно программа
end start
Код: Выделить всё
.model small
.386
.stack
.code
@start_point:
jmp @start
Код: Выделить всё
end @start_point
Это просто я так метки обозначаю, всегда начиная с "собачки"" писал(а):Правла, у меня метки отчего-то всегда были без "собачек" первым символом
По сути, ошибок нет, т.к. стоит директива .CODE - которая и обозначает Entry Point
Не знаю как там в MASM, но в TASM нет никаких вопросов
Вот типичный пример из книжки по TASM
Код: Выделить всё
.MODEL SMALL
.STACK 100h
.DATA
Message DB 'Привет!',13,10,'$'
.CODE
mov ax,@Data
mov dx,ax ; установить регистр DS таким
; образом, чтобы он указывал
; на сегмент данных
mov ah,9 ; функция DOS вывода строки
mov dx,OFFSET Message ; ссылка на сообщение "Привет!"
int 21h ; вывести "Привет!" на экран
mov ah,4ch ; функция DOS завершения
; программы
int 21h ; завершить программу
END
It's a long way to the top if you wanna rock'n'roll