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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 26.11.2008, 15:58   #1
lastochka
Пользователь
 
Аватар для lastochka
 
Регистрация: 25.11.2008
Сообщений: 23
По умолчанию преобразование латинских заглавных букв в строчные на assembler

Помогите, пожалуйста с заданием. У меня в tasm не создается com-файл.Пишет, что:Cannot generate COM file : invalid initial entry point address.Подскажите, как мне это исправить?
Код:
PHP код:
CODE SEGMENT
ORG 100H
ASSUME CS
:CODEDS:CODESS:CODEES:CODE
START
:
;
очистка экрана
MOV AX
0600H     ;AH=06H УСТАНОВКА ПРОКРУТКИAL=00 ВО ВЕСЬ ЭКРАН
MOV BH
07     ;ЧЕРНО-БЕЛЫЙ ЭКРАН
MOV CX
0000     ;ВЕРХНЯЯ ЛЕВАЯ ПОЗИЦИЯ
MOV DX
184FH     ;НИЖНЯЯ ПРАВАЯ ПОЗИЦИЯ
INT 10H     
;УПРАВЛЕНИЕ В BIOS

;УСТАНОВКА КУРСОРА В ПОЗИЦИЮ 00
MOV AH
02     ;ЗАПРОС НА УСТАНОВКУ КУРСОРА
MOV BH
00     ;ВЫБОР ВИДЕОСТРАНИЦЫ
MOV DX
0000     ;УСТАНОВКА КУРСОРА
INT 10H     
;УПРАВЛЕНИЕ В BIOS

;ВЫВОД ПРИГЛАШЕНИЯ НА ВВОД
MOV AH
09     ;ФУНКЦИЯ ВЫВОДА СТРОКИ
MOV DX
OFFSET MSG1     ;АДРЕС СТРОКИ
INT 21H     
;ПОЛЬЗОВАТЕЛЬСКОЕ ПРЕРЫВАНИЕ

;СЧИТЫВАНИЕ СИМВОЛОВВВЕДЕННЫХ С КЛАВИАТУРЫ
MOV AH
3FH     ;ФУНКЦИЯ ВВОДА
MOV BX
00     ;НОМЕР ДЛЯ КЛАВИАТУРЫ
MOV CX
254     ;ДОПУСТИМОЕ КОЛИЧЕСТВО ВВЕДЕННЫХ СИМВОЛОВ
MOV DX
OFFSET INBUF     ;ЗАНЕСЕНИЕ АДРЕСА БУФЕРА В РЕГИСТР DX
INT 21H     
;ПОЛЬЗОВАТЕЛЬСКОЕ ПРЕРЫВАНИЕ
SUB AX
02     ;ИЗОБЩЕГО КОЛИЧЕСТВА СИМВОЛОВ ВЫЧИТАЮТСЯ СИМВОЛЫ "ВВОД" И "КОНЕЦ СТРОКИ"

;ИЗМЕНЕНИЕ ЗАГЛАВНЫХ БУКВ НА СТРОЧНЫЕ
MOV SI
OFFSET INBUF     ;В РЕГИСТР sI (ИНДЕКС ПРИЕМНИКАЗАНОСИМ АДРЕС ПЕРВОГО СИМВОЛА
MOV CX
AX     ;В РЕГИСТР CX ЗАНОСИМ КОЛИЧЕСТВО СИМВОЛОВ
L1
:
MOV BL, [SI]     ;В BL ЗАНОСИМ ПРОСМАТРИВАЕМЫЙ ФАЙЛ
CMP BL
64     ;СРАВНИВАЕМ С 64 65=A
JBE VYHOD     
;ЕСЛИ МЕНЬШЕ ИЛИ РАВНО ЗАКАНЧИВАЕМ ПРОСТМОТР
CMP BL
90     ;СРАВНИВАЕМ С 90 90=Z
JA STROKI     
;ЕСЛИ БОЛЬШЕ ПРОВЕРИМ НА СТРОЧНОСТЬ
ADD BL
32     ;ЕСЛИ ЗАГЛАВНАЯ ЛАТИНСКАЯ СДЕЛАЕМ СТРОЧНОЙ
MOV 
[SI], BL     ;ВЕРНЕМ НА МЕСТО
JMP VYHOD     
;КОНЕЦ
STROKI
:
CMP BL97     ;СРАВНИВАЕМ С 97 97=a
JB VYHOD     
;ЕСЛИ МЕНЬШЕ ЗАКАНЧИВАЕМ
CMP BL
122     ;СРАВНИВАЕМ С 122 122=z
JA VYHOD     
;ЕСЛИ БОЛЬШЕ ЗАКАНЧИВАЕМ
MOV 
[SI], BL     ;ВОЗВРАЩАЕМ НА МЕСТО
VYHOD
:
INC SI     ;ПЕРЕХОД НА СЛЕДУЮЩИЙ СИМВОЛ
LOOP L1
MOV BL
BYTE PTR '$'
MOV [SI], BL     ;ЗАТЫКАЕТ СТРОКУ СИМВОЛОМ $

;
ВЫВОД НОВОЙ СТРОКИ
MOV AH
09
MOV DX
OFFSET MSG2
INT 21H
MOV DX
OFFSET INBUF
INT 21H

INT 20H     
;ЗАВЕРШЕНИЕ ПРОГРАММЫ
MSG1 DB 
'ENTER STRING OF SYMBOLS:','$'

MSG2 DB 'CONVERT STRING:','$'

INBUF DB 256 DUP (' ')

END 
Я точно знаю только то, что я ничего не знаю. Хотелось бы узнать еще что-нибудь.
lastochka вне форума Ответить с цитированием
Старый 27.11.2008, 00:51   #2
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,238
По умолчанию

да всё у Вас в порядке..
я абсолютный профан в ассемблере.
но, попробуйте вместо Вашего END
написать
так:
Код:
ENDS CODE
END START
ENDS - конец сегмента CODE - иначе выдаётся предупреждение
*Warning* T1.ASM(70) Open segment: CODE

а второй END - это конец вашего START:
Serge_Bliznykov вне форума Ответить с цитированием
Старый 27.11.2008, 10:59   #3
lastochka
Пользователь
 
Аватар для lastochka
 
Регистрация: 25.11.2008
Сообщений: 23
По умолчанию

Спасибо вам огромное за такой быстрый ответ. Все получилось.
Я точно знаю только то, что я ничего не знаю. Хотелось бы узнать еще что-нибудь.
lastochka вне форума Ответить с цитированием
Старый 28.11.2008, 20:34   #4
lastochka
Пользователь
 
Аватар для lastochka
 
Регистрация: 25.11.2008
Сообщений: 23
По умолчанию

Да, я еще кстати хотела спросить, почему эта прога в masm не ассемблируется?
Я точно знаю только то, что я ничего не знаю. Хотелось бы узнать еще что-нибудь.
lastochka вне форума Ответить с цитированием
Старый 18.05.2013, 17:23   #5
Milochka91
Новичок
Джуниор
 
Регистрация: 18.05.2013
Сообщений: 2
По умолчанию

Здравствуйте у меня проблема. Нужно написать программу в MASM32 которая преобразует строчные буквы в прописные.
Код:
.386
.model flat, stdcall
option casemap :none


include \masm32\include\windows.inc
include \masm32\include\user32.inc
include \masm32\include\kernel32.inc
include \masm32\include\gdi32.inc

includelib \masm32\lib\user32.lib
includelib \masm32\lib\kernel32.lib
includelib \masm32\lib\gdi32.lib

; —---- Прототипы функций —----------

WinMain PROTO :DWORD,:DWORD,:DWORD,:DWORD
WndProc PROTO :DWORD,:DWORD,:DWORD,:DWORD

.data
szDisplayName db "ПРЕОБРАЗОВАНИЕ СТРОЧНЫХ СИМВОЛОВ В ПРОПИСНЫЕ",0
CommandLine dd 0
hWnd dd 0
hInstance dd 0
szClassName db "Demo_Class",0
s1 db "Введенный символ: ",0
ls equ $-s1-1
d1 db "Преобразованный символ: ",0
ld equ $-d1-1

.code

start:
push NULL
call GetModuleHandle
mov hInstance, EAX

call GetCommandLine
mov CommandLine, EAX

push SW_SHOWDEFAULT
push CommandLine
push NULL
push hInstance
call WinMain

push EAX
call ExitProcess

WinMain proc hInst :DWORD,
hPrevInst :DWORD,
CmdLine :DWORD,
CmdShow :DWORD

; Локальные переменные процедуры

LOCAL wc :WNDCLASSEX
LOCAL msg :MSG

; Заполнение структуры WNDCLASSEX требуемыми параметрами

mov wc.cbSize, sizeof WNDCLASSEX
mov wc.style, CS_HREDRAW or CS_VREDRAW

mov wc.lpfnWndProc, offset WndProc
mov wc.cbClsExtra, NULL
mov wc.cbWndExtra, NULL

push hInst
pop wc.hInstance

mov wc.hbrBackground, COLOR_BTNFACE+5
mov wc.lpszMenuName, NULL
mov wc.lpszClassName, offset szClassName
invoke LoadIcon, NULL, IDI_APPLICATION

mov wc.hIcon, eax
invoke LoadCursor, NULL, IDC_ARROW

mov wc.hCursor, eax
mov wc.hIconSm, 0
invoke RegisterClassEx, ADDR wc

invoke CreateWindowEx, WS_EX_OVERLAPPEDWINDOW,ADDR szClassName,
ADDR szDisplayName, WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,
CW_USEDEFAULT, NULL, NULL, hInst, NULL
mov hWnd,eax
invoke ShowWindow,hWnd,SW_SHOWNORMAL
invoke UpdateWindow,hWnd

; цикл обработки сообщений

StartLoop:
push 0
push 0
push NULL
lea eax, msg
push eax
call GetMessage

cmp eax, 0
je ExitLoop

lea eax, msg
push eax
call TranslateMessage

lea eax, msg
push eax
call DispatchMessage

jmp StartLoop
ExitLoop:

mov eax, msg.wParam
ret

WinMain endp

WndProc proc hWin :DWORD,
uMsg :DWORD,
wParam :DWORD,
lParam :DWORD

LOCAL hdc :HDC
LOCAL ps :PAINTSTRUCT
LOCAL rect :RECT
LOCAL x, y :DWORD

cmp uMsg, WM_PAINT
jne next_1

invoke BeginPaint, hWnd, ADDR ps
mov hdc, EAX

invoke GetClientRect, hWin, ADDR rect
mov EAX, rect.right
sub EAX, rect.left
shr EAX, 2
mov x, EAX

mov EAX, rect.bottom
sub EAX, rect.top
shr EAX, 1
mov y, EAX

invoke TextOut, hdc, x, y, ADDR s1,ls
add y, 20
invoke TextOut, hdc, x, y, ADDR d1,ld

lea EDX, ps
push EDX
push hWnd
call EndPaint
ret
next_1:
cmp uMsg, WM_CHAR
jne next_2

invoke GetDC, hWin
mov hdc, EAX
invoke GetClientRect, hWin, ADDR rect

mov EAX, wParam
lea EDI, s1
add EDI, ls
sub EDI, 2
mov [EDI], AL

lea EDI, d1
add EDI, ld
sub EDI, 2
mov [EDI], AL

push dword ptr [EDI]
call IsCharUpper
cmp EAX, 1
je next
push EDI
exit:
int 	21h  
end start
При линковке выдает: (185) fatal error A1010: unmatched block nesting: WndProc
что делать? помогите пожалуста!
Milochka91 вне форума Ответить с цитированием
Старый 18.05.2013, 17:50   #6
vadimych
Форумчанин
 
Регистрация: 16.01.2011
Сообщений: 325
По умолчанию

Milochka91, эту ошибку можно убрать, написав WndProc endp перед end start.
vadimych вне форума Ответить с цитированием
Старый 19.05.2013, 11:58   #7
Milochka91
Новичок
Джуниор
 
Регистрация: 18.05.2013
Сообщений: 2
По умолчанию

Спасибо все в порядке теперь=)
Milochka91 вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
дан текстовый массив из 200 букв. Выстроить в алфавитном порядке все строчные буквы Тина Помощь студентам 6 02.07.2008 22:53
Дан текст из строчных латинских букв и других знаков. Вычеркнуть из текста все гласные буквы." XeRoX Помощь студентам 6 15.06.2008 09:41
Удвоить каждый из первых пяти цифровых символов и удалить 5 последних латинских букв gred Помощь студентам 5 16.05.2008 23:20
Почему скрипт преобразует ЗАГЛАВНЫЕ буквы в строчные??? lex1 Microsoft Office Excel 3 17.03.2008 11:21
Перебор заглавных букв в слове =LeonZone= Общие вопросы Delphi 8 02.11.2007 14:59