HELP! Помогите решить маленькую задачку! Я новичок...

Низкоуровневое программирование портов, микроконтроллеров и т.д.

Модератор: Andy

Ответить
Vitalka
Сообщения: 4
Зарегистрирован: 27 фев 2005, 18:38
Откуда: Lithuania

Это исходный код:

;direktyva .exe failo sukurimui
#MAKE_EXE#

;duomenu segmentas
data segment para public "data"
message db "Iveskite dvizenkli sesioliktaini skaiciu: $"
data ends

;steko segmentas
stk segment stack
db 100h dup (?)
stk ends

;kodo segmentas
code segment para public "code" ;kodo segmento pradzia
;*****************************************
;main procedura
main proc ;main proceduros pradzia
assume cs:code,ds:data,ss:stk ;surisa segmento registrus su segmentu vardais

;segmento registro ds inicializacija
mov ax,data ;duomenu segmento adresas registre ax
mov ds,ax ;ax i ds

;"Iveskite dvizenkli sesioliktaini skaiciu: " teksto isvedimas i ekrana
mov ah,9
mov dx,offset message
int 21h

xor ax,ax ;registro ax isvalymas

;kreipimasis i OS del simbolio ivedimo is klaviaturos
mov ah,1h ;1h i registra ah irasymas
int 21h ;21h pertraukimo generavimas

mov dl,al ;al i dl irasymas
sub dl,30h ;skirtumas: (dl)=(dl)-30h
cmp dl,9h ;(dl) su 9h palyginimas
jle M1 ;jeigu dl<=9h, persokti prie zymes M1
sub dl,7h ;skirtumas: (dl)=(dl)-7h
M1:
;registro dl turinio perstumimas per 4bitus i kaire
mov cl,4h ;4h i cl registra irasymas
shl dl,cl ;registro dl turinio perstumimas per 4bitus i kaire

int 21h ;21h pertraukimo iskvietimas
sub al,30h ;skirtumas: (al)=(al)-30h
cmp al,9h ;(al) su 9h palyginimas
jle M2 ;jeigu al<=9h, persokti prie zymes M2
sub al,7h ;skirtumas: (al)=(al)-7h

M2:
add dl,al ;sudetis: (dl)=(dl)+(al)
mov ax,4c00h ;4c00h irasymas i ax
int 21h ;21h pertraukimo iskvietimas

main endp ;proceduros main pabaiga
;*****************************************
code ends ;kodo segmento pabaiga
end main ;programos pradzios tasko nustatymas

А это надо сделать:
Дополнить программу инструкциями, с помощью которых будет разрешён ввод шестнадцатеричных чисел соответствующих символам строчными буквами (a, b, c, d, e, f) и их распознать, чтобы программа разрешала вводить только цифры 0...9 и буквы A...F и a...f. Полученный результат (регистр DL) вывести на экран в десятичном и шестнадцатиречном ввиде.

ПОМОГИТЕ. Уже 2 дня мучаюсь... =\
Andy
Сообщения: 238
Зарегистрирован: 17 фев 2004, 08:15
Откуда: Минск

Vitalka, нифига не понятно:
1) пользуемся ВВ кодом при оформлении кода программы. Противно читать - чесслово.
2) По поводу литовского языка. Пишите комментарии хотябы на английском языке чтобы было понятно. Ну хоть бы и на С++ :)
3) Даем осмысленные названия темам.

Дополнять твою программу неудобно, поэтому мой вариант: ввод 16-значного числа и вывод его в 10-ом и 16-ом виде:

Код: Выделить всё

CSeg	segment
	assume cs:CSeg,ds:CSeg
	org	100h
start:	
	mov	ax,3
	int	10h
	
	mov	ah,9
	mov	dx,offset strInput
	int	21h
	
	mov	ByteValue,0
	mov	bp,2
	
get_next:
	mov	ah,0
	int	16h
	
	call	IsNumberInRange
	jc	get_next
	
	; right char
	call	AppendValue
	
	dec	bp
	jnz	get_next

	; now we have this number - display it
	mov	ah,9
	mov	dx,offset strNewLines
	int	21h

	call	DisplayAsDec
	
	mov	ah,9
	mov	dx,offset strNewLine
	int	21h
	
	call	DisplayAsHex

	; Exit program	
	mov	ah,9
	mov	dx,offset strNewLines
	int	21h

	mov	ah,9
	mov	dx,offset strAnyKey
	int	21h
	
	mov	ah,0
	int	16h
	
	mov	ah,4ch
	int	21h

; FUNCTIONS	
AppendValue	proc
	sub	al,30h
	
	cmp	al,9h
	jbe	correct_number
	
	; letter
	sub	al,7
	cmp	al,0fh
	jbe	correct_number
	
	sub	al,20h
	
correct_number:

	cmp	bp,2
	jnz	low_bits
	
	shl	al,4
	
low_bits:
	add	ByteValue,al
	ret
	
	endp
	
IsNumberInRange	proc
	xor	bx,bx
	mov	si,offset CharList
checking:
	cmp	al,[si + bx]
	jz	checked_ok
	
	inc	bx
	cmp	bx,CHAR_ARRAY_SIZE
	jnz	checking
	
checked_fail:
	stc
	ret
	
checked_ok:
	cmp	bp,2
	jz	put_first

	mov	byte ptr strValue16 + 1, al
	jmp	print_it
	
put_first:
	mov	byte ptr strValue16, al

print_it:
	int	29h	; display char in AL - UNDOCUMENTED!
	clc
	ret
		endp
		
DisplayAsDec	proc
	mov	ah,9
	mov	dx,offset strDisplayDec
	int	21h
	
	mov	al,ByteValue
	mov	cl,10

	mov	bx,2
	mov	si,offset strValue

div10_again:
	mov	ah,0
	div	cl
	
	add	ah,30h
	mov	byte ptr [si + bx], ah
	
	dec	bx
	
	or	al,al
	jnz	div10_again
	
	mov	ah,9
	mov	dx,offset strValue
	int	21h
	
	ret
	endp
		
DisplayAsHex	proc
	mov	ah,9
	mov	dx,offset strDisplayHex
	int	21h
	
	mov	ah,9
	mov	dx,offset strValue16
	int	21h
	
	ret
	endp
; DATA	
ByteValue	db 0
CharList	db "0123456789ABCDEFabcdef"
CHAR_ARRAY_SIZE	equ $ - CharList

strInput	db "Input a hex number: $"
strDisplayDec	db "Display decimal: $"
strDisplayHex	db "Display hex: $"
strAnyKey	db "Kick any key to exit...$"

strNewLine	db 0dh,0ah,"$"
strNewLines	db 0dh,0ah,0dh,0ah,"$"
	
strValue	db 4 dup (0)
		db "$"
strValue16	db 2 dup (0)
		db "$"
CSeg	ends
end	start
Уффф. На комментарии уже сил не хватило. Строка перед "десятичным" выводом преобразовывается. Перед "16-ричным" нет. Выводится как и вводилась. Влом писать еще лишних 30 строк.
*provided AS IS
Vitalka
Сообщения: 4
Зарегистрирован: 27 фев 2005, 18:38
Откуда: Lithuania

Andy, я так же потом подумал, когда увидел, что вышло после вставки кода с текстом. Полная неразберуха. =) Я выложил такой же код с комментариями на русском на этот линк в виде .jpg: http://public.fotki.com/vitalka/dosia/assembler.html Помоги, пожалуйста. =) Я совсем не бычу в этом. Родина тебя не забудет. :) )) Можешь и фотки там мои посмотреть заодно. :) )) А это надо сделать:
Дополнить программу инструкциями, с помощью которых будет разрешён ввод шестнадцатеричных чисел соответствующих символам строчными буквами (a, b, c, d, e, f) и их распознать, чтобы программа разрешала вводить только цифры 0...9 и буквы A...F и a...f. Полученный результат (регистр DL) вывести на экран в десятичном и шестнадцатиречном ввиде.
Andy
Сообщения: 238
Зарегистрирован: 17 фев 2004, 08:15
Откуда: Минск

Vitalka, епрст :) Ну дык смотри мой предыдущий пост. Я просто не твою прогу дополнил - а свой вариант написал. Даже лучше получилось и делает что требуется. ;)
*provided AS IS
Vitalka
Сообщения: 4
Зарегистрирован: 27 фев 2005, 18:38
Откуда: Lithuania

Andy, у меня задание - пополнить тот код. Это в универе такую лабору надо сделать. Самое классное, что никто не бычит в ассемблере, нас даже ничему не учили: ни синтексу, ни командам, а дали делать. И делаем мы их в программе emu8086. Попробовал твой код, выдаёт ошибку. =\ Там пример с книги Юрова - Ассемблер. Если бы я понимал как сделать, я бы и сам помучался. А так я 0! :)
Andy
Сообщения: 238
Зарегистрирован: 17 фев 2004, 08:15
Откуда: Минск

Vitalka, переделывать сложнее чем писать :)
Попробовал твой код, выдаёт ошибку.
Не может быть - у меня работает. Что пишет???
*provided AS IS
Vitalka
Сообщения: 4
Зарегистрирован: 27 фев 2005, 18:38
Откуда: Lithuania

Вот в этом месте выдаёт.
CSeg segment <--- ТУТА!!!
assume cs:CSeg,ds:CSeg
org 100h
start:
mov ax,3
int 10h
Andy
Сообщения: 238
Зарегистрирован: 17 фев 2004, 08:15
Откуда: Минск

Vitalka, хм... А что за компилятор? И что за ошибка?

Я компилирую так:
tasm.exe thisfile.asm
tlink.exe /t thisfile.obj
*provided AS IS
Ответить