Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 16.07.2009, 01:33   #1
maziLa
Пользователь
 
Регистрация: 08.12.2008
Сообщений: 30
По умолчанию Программа компилируется, но не работает

У меня есть код програмы
0 ошибок и 0 опасностей;
но программа выдаёт такую ошибку fatal error L1101

Код:
sseg   segment  stack 'STACK'
        db      1024 dup (?)
sseg   ends
;---------------------------------------------------------------
dseg    segment word public 'DATA'
TextMenu  db  13, 10, 10
db  '                     MENU                       ',13,10
db  ' ****************************************************',13,10
db  ' 1 - Enter string from a control example     ',13,10
db  ' 2 - Enter string from keyboard      ',13,10
db  ' 3 - Treatment of string             ',13,10
db  ' 4 - Show the result   	',13,10
db  ' 0 - Exit  ?..                  ',13,10
db  '  Your choose ? ','$'

textK   db  'Proggrammer is the good man.',13,10,36
text4   db  'Write your text: ','$'
text5   db  'wait please... ','$'
text6   db  'Suma kajdogo nechotnogo slova :','$'
text7   db  'Suma vsex nechotnix slov : ','$'
 
;------ Структура для хранения введенной строки ----------------
Bufer   db  60,61 dup(?)
CRLF    db  13, 10, '$'
Bufdx    dw  ?
Bufcx    dw  ?
BufM    db  1
bufstr    dw ?
rez       dw ?
prom1   db  1
prom2   db  0

dseg ends

cseg    segment  'CODE'
  assume  cs:cseg, ss:sseg, ds:dseg, es:dseg
;------------------------------------------------------
Start  proc    far
        mov  ax, dseg ; Инициализировать сегментный регистр ds на сегмент данных dseg
        mov  ds, ax
;----------------------------------------------------------
s:      call ClrScr   ; Очистка экрана 
         mov dx, 0018h ; Устанавливаем курсор для вывода строки описания
        call SetCur
        call Menu     ; Вывести текст меню
        cmp dl,'1'
        je  s1      ; АвтоВвода текста с контрольного примера
        cmp dl,'2'
        je  s2      ;Вводa текста с клавиатуры
        cmp dl,'3'
        je  s3      ; Идти на процедуры Обработки текста и Вывод результата
        cmp dl,'4'
        je  s4      ; Идти на процедуру Вывода результата
        cmp dl,'0'
        jne s       ; Не конец программы. Очистить экрана. Вывести текст меню
  ;------------------------------------------------------
s0:     mov  ax, 4C00h  ; Выйти из программы 
                    ;ah=номер ф-ции   al=код выхода
        int  21h
;------------------------------------------------------
s1:     call ss1  ; процедура: АвтоВвод текста  с контрольного примера
        jmp  s
s2:     call ss2  ; процедура: Ввод текста с клавиатуры
        jmp  s
s3:     call ss3  ; процедура: Обработка текста 
        jmp  s
s4:     call ss4  ; Вывода результата
        jmp  s

Start  endp

Menu proc        
        mov  dx, offset TextMenu    ; Вывод заставки
        call WrStr
        mov  ah,7
m1:     int  21h
        cmp  al, '0'
        JL   m1
        cmp  al, '4'
        JG   m1
m2:  mov  dl, al; Дублирование введенного символа на экране
        mov  ah, 2
        int  21h
        call NewLine
        call NewLine
        ret
Menu endp
;---------------------------------------------------------------------------------------------
Read_Key proc
        push ax
        mov  ah,7     ; Открыли экран ввода-вывода
        int  21h
        pop  ax
        ret               ; Выход из процедуры
Read_Key endp
;---------------------------------------------------------------------------------------------------
Read_KeyS proc
          push ax
          lea dx,bufer            ; Вводим строку , строка сохраняется в dx
          mov ah,0Ah
          int 21h
          sub ch,ch
          mov cl,bufer+1	; Вычисляем ее длинну
          add dx,2		; в регистр ДХ записуется строка 
          pop ax
          ret
Read_KeyS endp
;----------------------------------------------------------------------------------------------
NewLine proc
          push    dx
          mov     dx, offset CRLF
          call    WrStr
          pop     dx
          ret
NewLine endp
;----------------------------------------------------------------------------------------------
maziLa вне форума Ответить с цитированием
Старый 16.07.2009, 01:35   #2
maziLa
Пользователь
 
Регистрация: 08.12.2008
Сообщений: 30
По умолчанию

Продолжение
Код:
ClrScr proc
    push ax bx cx dx
    mov ax, 0600h          ; Прокручиваем (06h)
                                      ; весь экран (00h)
    mov bh, 07h   ; Нормальный черно-белый атрибут
    mov cx, 0000h; Начиная с верхней левой позиции
    mov dx, 184fh               ; До нижней правой
    int 10h		; Прерывание BIOS
    pop dx cx bx ax
    ret                                   ; Возврат из процедуры
ClrScr endp
; ---------------------------------------------------------------
WrStr proc
        push ax
        mov  ah, 09h; Функция вывода строки на экран
        int  21h	; Прерывание ДОС
        pop  ax
        ret		; Возврат из процедуры
WrStr endp
; ---------------------------------------------------------------

SetCur proc
    push ax bx
    mov ah, 02h ;Вторая функция (установка курсора)
    mov bh, 00h	; Нулевая страница экранной памяти
    int 10h		; Прерывание BIOS
    pop bx ax
    ret		; Возврат из процедуры
SetCur endp
;-----------------------------------------------------------------------------------------
SS1 proc
        push ax cx dx si        ; Вывод обрабатываемого контрольного текста
        mov  dx, offset text3
        call WrStr
        lea dx, TextK          ; В dx знач. смещения первого байта 
	mov cx, 0029	  ; Заносим в cx длинну текста
	call WrStr           ; Сохранение исходных параметров обрабат. текста
        mov Bufcx,cx
        mov Bufdx,dx
        mov BufM, 1
        call Read_Key
        pop  si dx cx ax
        ret
SS1 endp
; ---------------------------------------------------------------
SS2 proc
        push ax cx dx si
mss2:   mov  dx, offset Text4 ; Приглашение к вводу
        call WrStr
        call Read_KeyS        ; Ввод текста с клавиатуры
        cmp  Bufer+1, 00
        jz   mss2; Если длина строка = 0  то повтряем ввод
; Сохранение исходных параметров обрабат. текста
        lea DX, Bufer+2 ;  DX:= начало строки буфера
        xor CX, CX
        mov CL, Bufer+1; CX:= длинна строки
        mov Bufcx,CX; а потом сохраняем эти значения в
        mov Bufdx, DX; соответствующих ячейках памяти
        call NewLine
        push dx
        mov  dx, offset Text5  ; Заст. 'Обрабат.-ется текст:'
        call WrStr
        pop  dx
; Вывод обрабат-мого текста введенного с клавиатуры
        mov ah,40h
        mov bx,2
        int 21h
        call Read_Key; Ждем нажатия любой клавиши
        pop  si dx cx ax
        ret
SS2 endp
; ---------------------------------------------------------------
;Перевернуть строку 
SS3 proc
push ax bx cx dx si
mov  dx,Bufdx
lea si, dx
mov  cx,Bufcx
dec cx
add si, cx
xor ax, ax
mov cx,Bufcx
div 2h
my1:     mov al,[dx]
	mov ah,[si]
	mov [si],al
	mov [dx],ah
	inc dx 
	dec si 
	dec cx 
	jgz my1
mov ah,09h
lea bufbx,dx
int 21h
mov dx, bufstr
call WrStr
int 21h
call Read_Key
pop ax bx cx dx si
ret
SS3 endp
; ---------------------------------------------------------------
; Проц. считает сумму аски кодов нечётных слов и их общую суму
SS4 proc
push ax bx cx dx si  
mov  ax,Bufdx    
mov  cx,Bufcx  
mov dx , offset text6
call WrStr

qf:	sub bx , bx
	mov   dl, al 
	or dl  , 30h   
	add  bx , dl
	inc ax 
	cmp byte ptr [al] , ' '
	je qg     
	dec cx   
	jnz qf   

qg:	dec cx
	inc Prom2
	mov dx , Prom2
	div 2h
	cmp dh , 00
	je qf	;Проверка на то нечётное слово или нет :D
	mov dl , Prom1
	mov dl , 02h   ;вывод номера слова
	int 21h
	inc prom1
	inc prom1       ;+2 к пром1
	mov dl , ':'
	int 21h        
	mov   bx, 02h       ;вывод сумы кодов       
	int   21h 
	add rez , bx   ;к результату пребавляем слово
	cmp cl , 00h     
	jnz qf    ; если строка не закончилася 
	mov dx , offset text7 
	call WrStr
	mov dx , rez
	call WrStr
	
pop ax bx cx dx si   
        ret
SS4 endp
Также я немного не уверен в правильности работы процедур SS3 И SS4
Помогите пожалуйста буду очень признателен.
maziLa вне форума Ответить с цитированием
Старый 16.07.2009, 11:46   #3
Goodwin98
equ asm
Участник клуба
 
Аватар для Goodwin98
 
Регистрация: 02.05.2009
Сообщений: 1,605
По умолчанию

Странно, что он у тебя вообще скомпилировался.
Вот список ошибок.
Цитата:
temp.asm(193) : error A2070: invalid instruction operands
temp.asm(199) : error A2001: immediate operand not allowed
temp.asm(207) : error A2008: syntax error : jgz
temp.asm(230) : error A2070: invalid instruction operands
temp.asm(240) : error A2001: immediate operand not allowed
temp.asm(262) : error A2088: END directive required at end of file
temp.asm(262) : fatal error A1010: unmatched block nesting : cseg
Какой вопрос - такой ответ. Не забываем пользоваться поиском, гуглом.
Помощь в выполнении работ по ассемблеру ICQ:2725322O4
Goodwin98 вне форума Ответить с цитированием
Старый 16.07.2009, 19:26   #4
MalCer
Форумчанин
 
Аватар для MalCer
 
Регистрация: 15.07.2008
Сообщений: 615
По умолчанию

Я тоже не смог скомпилировать ни на MASM, ни на TASM
Цитата:
Также я немного не уверен в правильности работы процедур SS3 И SS4
Процедура SS3 вроде составлена верно, а вот насчет SS4 я не уверен. Желательно, если бы ты выложил код который смог бы скомпилироваться, а то переделывать не охота!
xor eax, eax
xchg [eax], eax
MalCer вне форума Ответить с цитированием
Старый 16.07.2009, 22:21   #5
maziLa
Пользователь
 
Регистрация: 08.12.2008
Сообщений: 30
По умолчанию

Код:
sseg   segment  stack 'STACK'
        db      1024 dup (?)
sseg   ends
;---------------------------------------------------------------
dseg    segment word public 'DATA'
TextMenu  db  13, 10, 10
db  '                     MENU                       ',13,10
db  ' ****************************************************',13,10
db  ' 1 - Enter string from a control example     ',13,10
db  ' 2 - Enter string from keyboard      ',13,10
db  ' 3 - Treatment of string             ',13,10
db  ' 4 - Show the result   	',13,10
db  ' 0 - Exit  ?..                  ',13,10
db  '  Your choose ? ','$'

textK   db  'Proggrammer is the good man.',13,10,36
text3   db  'Control Example: ','$' 
text4   db  'Write your text: ','$'
text5   db  'wait please... ','$'
text6   db  'Suma kajdogo nechotnogo slova :','$'
text7   db  'Suma vsex nechotnix slov : ','$'
 
;------ Структура для хранения введенной строки ----------------
Bufer   db  60,61 dup(?)
CRLF    db  13, 10, '$'
Bufdx    dw  ?
Bufcx    dw  ?
BufM    db  1
bufstr    dw ?
rez       dw ?
prom1   db  1
prom2   db  0
pdl    db  2h

dseg ends

cseg    segment  'CODE'
  assume  cs:cseg, ss:sseg, ds:dseg, es:dseg
;------------------------------------------------------
Start  proc    far
        mov  ax, dseg ; Инициализировать сегментный регистр ds на сегмент данных dseg
        mov  ds, ax
;----------------------------------------------------------
s:      call ClrScr   ; Очистка экрана 
         mov dx, 0018h ; Устанавливаем курсор для вывода строки описания
        call SetCur
        call Menu     ; Вывести текст меню
        cmp dl,'1'
        je  s1      ; АвтоВвода текста с контрольного примера
        cmp dl,'2'
        je  s2      ;Вводa текста с клавиатуры
        cmp dl,'3'
        je  s3      ; Идти на процедуры Обработки текста и Вывод результата
        cmp dl,'4'
        je  s4      ; Идти на процедуру Вывода результата
        cmp dl,'0'
        jne s       ; Не конец программы. Очистить экрана. Вывести текст меню
  ;------------------------------------------------------
s0:     mov  ax, 4C00h  ; Выйти из программы 
                    ;ah=номер ф-ции   al=код выхода
        int  21h
;------------------------------------------------------
s1:     call ss1  ; процедура: АвтоВвод текста  с контрольного примера
        jmp  s
s2:     call ss2  ; процедура: Ввод текста с клавиатуры
        jmp  s
s3:     call ss3  ; процедура: Обработка текста 
        jmp  s
s4:     call ss4  ; Вывода результата
        jmp  s

Start  endp

Menu proc        
        mov  dx, offset TextMenu    ; Вывод заставки
        call WrStr
        mov  ah,7
m1:     int  21h
        cmp  al, '0'
        JL   m1
        cmp  al, '4'
        JG   m1
m2:  mov  dl, al; Дублирование введенного символа на экране
        mov  ah, 2
        int  21h
        call NewLine
        call NewLine
        ret
Menu endp
;---------------------------------------------------------------------------------------------
Read_Key proc
        push ax
        mov  ah,7     ; Открыли экран ввода-вывода
        int  21h
        pop  ax
        ret               ; Выход из процедуры
Read_Key endp
;---------------------------------------------------------------------------------------------------
Read_KeyS proc
          push ax
          lea dx,bufer            ; Вводим строку , строка сохраняется в dx
          mov ah,0Ah
          int 21h
          sub ch,ch
          mov cl,bufer+1	; Вычисляем ее длинну
          add dx,2		; в регистр ДХ записуется строка 
          pop ax
          ret
Read_KeyS endp
;----------------------------------------------------------------------------------------------
maziLa вне форума Ответить с цитированием
Старый 16.07.2009, 22:21   #6
maziLa
Пользователь
 
Регистрация: 08.12.2008
Сообщений: 30
По умолчанию

Код:
NewLine proc
          push    dx
          mov     dx, offset CRLF
          call    WrStr
          pop     dx
          ret
NewLine endp
;----------------------------------------------------------------------------------------------
ClrScr proc
    push ax bx cx dx
    mov ax, 0600h          ; Прокручиваем (06h)
                                      ; весь экран (00h)
    mov bh, 07h   ; Нормальный черно-белый атрибут
    mov cx, 0000h; Начиная с верхней левой позиции
    mov dx, 184fh               ; До нижней правой
    int 10h		; Прерывание BIOS
    pop dx cx bx ax
    ret                                   ; Возврат из процедуры
ClrScr endp
; ---------------------------------------------------------------
WrStr proc
        push ax
        mov  ah, 09h; Функция вывода строки на экран
        int  21h	; Прерывание ДОС
        pop  ax
        ret		; Возврат из процедуры
WrStr endp
; ---------------------------------------------------------------

SetCur proc
    push ax bx
    mov ah, 02h ;Вторая функция (установка курсора)
    mov bh, 00h	; Нулевая страница экранной памяти
    int 10h		; Прерывание BIOS
    pop bx ax
    ret		; Возврат из процедуры
SetCur endp
;-----------------------------------------------------------------------------------------

SS1 proc
        push ax cx dx si        ; Вывод обрабатываемого контрольного текста
        mov  dx, offset text3
        call WrStr
        lea dx, TextK          ; В dx знач. смещения первого байта 
	mov cx, 0029	  ; Заносим в cx длинну текста
	call WrStr           ; Сохранение исходных параметров обрабат. текста
        mov Bufcx,cx
        mov Bufdx,dx
        mov BufM, 1
        call Read_Key
        pop  si dx cx ax
        ret
SS1 endp
; ---------------------------------------------------------------
SS2 proc
        push ax cx dx si
mss2:   mov  dx, offset Text4 ; Приглашение к вводу
        call WrStr
        call Read_KeyS        ; Ввод текста с клавиатуры
        cmp  Bufer+1, 00
        jz   mss2; Если длина строка = 0  то повтряем ввод
; Сохранение исходных параметров обрабат. текста
        lea DX, Bufer+2 ;  DX:= начало строки буфера
        xor CX, CX
        mov CL, Bufer+1; CX:= длинна строки
        mov Bufcx,CX; а потом сохраняем эти значения в
        mov Bufdx, DX; соответствующих ячейках памяти
        call NewLine
        push dx
        mov  dx, offset Text5  ; Заст. 'Обрабат.-ется текст:'
        call WrStr
        pop  dx
; Вывод обрабат-мого текста введенного с клавиатуры
        mov ah,40h
        mov bx,2
        int 21h
        call Read_Key; Ждем нажатия любой клавиши
        pop  si dx cx ax
        ret
SS2 endp
; ---------------------------------------------------------------
;Перевернуть строку 
SS3 proc
push ax bx cx dx si
mov  dx,Bufdx
lea si, Bufdx
mov  cx,Bufcx
dec cx
add si, cx
xor ax, ax
mov al, 2h
mov cx,Bufcx
div al
xor al , al
my1:     mov al,dl
	mov ah,[si]
	mov [si],al
	mov dl,ah
	inc dx 
	dec si 
	dec cx 
	cmp cx , 0000
	jnz my1
mov ah,09h
;lea bufbx,dx
int 21h
mov dx, bufstr
call WrStr
int 21h
call Read_Key
pop ax bx cx dx si
ret
SS3 endp
; ---------------------------------------------------------------
; Проц. считает сумму аски кодов нечётных слов и их общую суму
SS4 proc
push ax bx cx dx si  
mov  ax,Bufdx    
mov  cx,Bufcx  
mov dx , offset text6
call WrStr

qf:	xor bx , bx
	mov   dl, al 
	;add   dl, 30h   
	add  [bx] , dl
	inc ax 
	cmp al , ' '
	je qg     
	;dec cx   
	;jnz qf   
	loop qf
qg:	dec cx
	inc Prom2
	mov dl , Prom2
	div pdl
	cmp dh , 00
	je qf	;Проверка на то нечётное слово или нет :D
	mov dl , Prom1
	mov dl , 02h   ;вывод номера слова
	int 21h
	inc prom1
	inc prom1       ;+2 к пром1
	mov dl , ':'
	int 21h        
	mov   bx, 02h       ;вывод сумы кодов       
	int   21h 
	add rez , bx   ;к результату пребавляем слово
	cmp cl , 00h     
	jnz qf    ; если строка не закончилася 
	mov dx , offset text7 
	call WrStr
	mov dx , rez
	call WrStr
	int 21h
call Read_key
pop ax bx cx dx si   
ret
SS4 endp

cseg ends
end start
maziLa вне форума Ответить с цитированием
Старый 17.07.2009, 11:24   #7
MalCer
Форумчанин
 
Аватар для MalCer
 
Регистрация: 15.07.2008
Сообщений: 615
По умолчанию

Я не совсем понял по этому коду, какую строку нужно перевернуть(инвертировать). Думаю, что вот эту:
Код:
textK   db  'Proggrammer is the good man.',13,10,36
Тогда вид процудуры SS3 я сделал так:
Код:
SS3 proc
         push ax bx cx dx si
         xor ax, ax
         mov cx, 5
         lea bx, textK
         lea si, textK
         add si,27
my1:
         mov al,[bx]
         mov ah,[si]
         mov [si],al
         mov [bx],ah
         inc bx 
         dec si
         dec cx
         jnz my1
         mov ah,09h
         lea dx,textK
         int 21h
         call WrStr
         int 21h
        call Read_Key
        pop ax bx cx dx si
        ret
SS3 endp
xor eax, eax
xchg [eax], eax
MalCer вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Компилируется но не работает... Версия ICQclient'a 1.21 DeDoK Общие вопросы Delphi 11 26.03.2009 12:09
Программа компилируется но не выводит результат в метку prikolist Общие вопросы C/C++ 2 24.03.2009 19:19
Не компилируется программа kiloruble Общие вопросы C/C++ 11 17.11.2008 20:51
Не компилируется программа VladimirVB Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 4 14.10.2008 23:22