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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 03.11.2013, 00:57   #1
zCarrier
 
Аватар для zCarrier
 
Регистрация: 12.11.2010
Сообщений: 7
По умолчанию ASM, считать названия файлов введенные через параметры запуска

Правка: извините, забыл упомянуть компилятор в названии темы. Это TASM.

Доброго времени суток!

Обращаюсь сюда за помощью, ибо больше как-бы нет у кого спросить, а сам уже "загнался" в мясо:/

Итак, суть задачи проста - нужно ввести нпр.
prog 1.txt 2.txt rez.txt
В первом и втором файле будут числа, их сложить и вывести результат в третий файл. В случае неверных параметров/их отсутствия, должно выводится хелп-сообщение.

Убился на моменте, когда мне нужно обработать параметры и считать названия файлов в, грубо говоря, переменные. Какие бы я параметры ни вводил(верные, неверные,ваще никаких) - выводится хелп сообщение.

Буду бесконечно благодарен если кто-нибудь ткнет меня носом в мой косяк и доходчивым языком(или линком) объяснит, что я делаю неправильно и как сделать так, чтоб работало.

в ch храню кол-во уже написанных символов в название файла
cl - номер файла, название которого в данный момент собираю
F1-3 для названий файлов

Код:
.model small
.stack 100h
.data
	helpMsg db "usage - prog int1.txt int2.txt rez.txt(file names <=20), program takes int from duom1.txt and duom2.txt, sums and writes answer to rez.txt", 10,13,"$"
	F1 db 20 dup('0')
	F2 db 20 dup('0')
	F3 db 20 dup('0')
.code

start:
	mov ax, @data 	; Loading the start of data segment to ax
	mov ds, ax						
	mov di, 81h ;setting di to 81h since the parameters are held in es:0081
	
checking:
	mov ax, es:[di]	;reading first two bytes of parameter
	inc di		;inc di so that next time we read 1 byte further
	
	cmp al, 32 ;if the user entered space, then we continue process it
	je spaceEntered
	
	cmp al, 10  ;if next symbol is enter, we check if he have file names yet
	je enterPressed
	
	cmp ax, "?/" ; if the user entered /?, we print help msg
	je printHelp
	
	jmp creatingFileNames;if none of the above shoots, hence we have a symbol of file name
	
spaceEntered:
	inc cl
        xor ch,ch
	jmp checking

enterPressed:
	cmp cl,3;if we already were filling 3rd name, then the enter is in the right place and we move in
	je nextPhase
	jmp printHelp ;if enter isn't in the right place
	
printHelp:	
	mov DX, offset helpMsg
	mov AH, 09h
	int 21h	
	jmp theEnd
    
creatingFileNames:
	cmp cl,1
	je firstFile
	cmp cl,2
	je secondFile
	cmp cl,3
	je thirdFile
    firstFile:
        mov si,offset F1
        xor bx,bx
        add bl,ch
        mov byte ptr [bx+si],al
        inc ch
        jmp checking
    secondFile:
        mov si,offset F2
        xor bx,bx
        add bl,ch
        mov byte ptr [bx+si],al
        inc ch
        jmp checking
    thirdFile:
        mov si,offset F2
        xor bx,bx
        add bl,ch
        mov byte ptr [bx+si],al
        inc ch
        jmp checking
nextPhase: ;
theEnd:
	mov ah,4Ch    ; exit the program
	int 21h
end start

Последний раз редактировалось zCarrier; 03.11.2013 в 01:12.
zCarrier вне форума Ответить с цитированием
Старый 08.11.2013, 10:43   #2
zCarrier
 
Аватар для zCarrier
 
Регистрация: 12.11.2010
Сообщений: 7
По умолчанию

Окей, т.к. к сожалению, никто не захотел в этом копаться...
В итогде починил собственноручно. Делюсь результатом с надеждой, что кому-нибудь он поможет
Так вот, реально сам не понял как и почему, но td показывал что в начале в CX записано значение 0, а emu8086 сказал что там нечто другое.. В итоге добавил строчку xor cx,cx в начале и всё заработало. На всякий случай, если были еще какие-то изменения о которых я забыл, вкидываю код заново.
Код:
.model small
.stack 100h
.data
	helpMsg db "usage - prog duom1.txt duom2.txt rez.txt(file names <=20), kur programa sudeda du desimtainius skaicius esancius failuose duom1.txt ir duom2.txt, ir isveda rezultata i rez.txt", 10,13,"$"
	F1 db 20 dup('0')
	F2 db 20 dup('0')
	F3 db 20 dup('0')
    flag db "flaag!",10,13,"$"
.code

start:
	mov ax, @data 	; Loading the start of sata egment to ax
	mov ds, ax						
	mov di, 81h ;setting di to 81h since the parameters are held in es:0081   
	xor cx,cx
	
checking:
	mov ax, es:[di]	;reading first two bytes of parameter
	inc di		;inc di so that next time we read 1 byte further
	
	cmp al, 20h ;if the user entered space, then we continue process it
	je spaceEntered
	
	cmp al, 0Dh  ;if next symbol is enter, we check if he have file names yet
	je enterPressed
	
	cmp ax, "?/" ; if the user entered /?, we print help msg
	je printHelp
	
	jmp creatingFileNames;if none of the above shoots, hence we have a symbol of file name
    
printHelp:	
	mov DX, offset helpMsg
	mov AH, 09h
	int 21h	
	jmp theEnd	
    
spaceEntered:
	inc cl
    xor ch,ch
	jmp checking

enterPressed:
    cmp cl,3
	je nextPhase
	jmp printHelp
    
creatingFileNames:
	cmp cl,1
	je firstFile
	cmp cl,2
	je secondFile
	cmp cl,3
	je thirdFile
	firstFile:
        mov si,offset F1
        xor bx,bx
        add bl,ch
        mov byte ptr [bx+si],al
        inc ch
        jmp checking
    secondFile:
        mov si,offset F2
        xor bx,bx
        add bl,ch
        mov byte ptr [bx+si],al
        inc ch
        jmp checking
    thirdFile:
        mov si,offset F2
        xor bx,bx
        add bl,ch
        mov byte ptr [bx+si],al
        inc ch
        jmp checking
nextPhase:
    mov dx, offset flag
    mov ah, 09h    
    int 21h
theEnd:
	mov ah,4Ch    ; exit the program
	int 21h
end start
zCarrier вне форума Ответить с цитированием
Старый 08.11.2013, 10:58   #3
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
но td показывал что в начале в CX записано значение 0,
ага. уже была здесь задача, где под дебаггером деление проходило нормально, а без дебаггера - выдавалась ошибка. И именно в этом же была причина - дебаггер обнулял регистры, а реально под ОС там был мусор...
Молодец, что нашёл!


Цитата:
Окей, т.к. к сожалению, никто не захотел в этом копаться...
В итогде починил собственноручно. Делюсь результатом с надеждой, что кому-нибудь он поможет
И опять таки молодец! И что решил и что выложил код.

А по поводу помощи...
Печально, что никто не отозвался...
Согласитесь, что ассемблер (тем более под DOS) - это не тот код, где всё просто и наглядно и в котором тянет разобраться!
Зато это большой плюс к вашему скилу владения Ассемблером!
Serge_Bliznykov вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Стереть параметры запуска после запуска Anton911 Общие вопросы Delphi 18 14.04.2013 15:17
Реализовать программу через параметры-значений и параметры-ссылок bufalo C# (си шарп) 3 14.12.2011 17:10
Параметры запуска приложения lmiol Помощь студентам 0 04.05.2010 22:10
параметры запуска TaTT DoGG Общие вопросы .NET 5 19.03.2009 16:19
Параметры запуска проги GAGARIN-NEW Общие вопросы Delphi 7 18.10.2007 23:10