HELP! Помогите решить маленькую задачку! Я новичок...
Модератор: Andy
Это исходный код:
;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 дня мучаюсь... =\
;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 дня мучаюсь... =\
Vitalka, нифига не понятно:
1) пользуемся ВВ кодом при оформлении кода программы. Противно читать - чесслово.
2) По поводу литовского языка. Пишите комментарии хотябы на английском языке чтобы было понятно. Ну хоть бы и на С++
3) Даем осмысленные названия темам.
Дополнять твою программу неудобно, поэтому мой вариант: ввод 16-значного числа и вывод его в 10-ом и 16-ом виде:
Уффф. На комментарии уже сил не хватило. Строка перед "десятичным" выводом преобразовывается. Перед "16-ричным" нет. Выводится как и вводилась. Влом писать еще лишних 30 строк.
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
*provided AS IS
Andy, я так же потом подумал, когда увидел, что вышло после вставки кода с текстом. Полная неразберуха. =) Я выложил такой же код с комментариями на русском на этот линк в виде .jpg: http://public.fotki.com/vitalka/dosia/assembler.html Помоги, пожалуйста. =) Я совсем не бычу в этом. Родина тебя не забудет.
)) Можешь и фотки там мои посмотреть заодно.
)) А это надо сделать:
Дополнить программу инструкциями, с помощью которых будет разрешён ввод шестнадцатеричных чисел соответствующих символам строчными буквами (a, b, c, d, e, f) и их распознать, чтобы программа разрешала вводить только цифры 0...9 и буквы A...F и a...f. Полученный результат (регистр DL) вывести на экран в десятичном и шестнадцатиречном ввиде.


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


*provided AS IS
Andy, у меня задание - пополнить тот код. Это в универе такую лабору надо сделать. Самое классное, что никто не бычит в ассемблере, нас даже ничему не учили: ни синтексу, ни командам, а дали делать. И делаем мы их в программе emu8086. Попробовал твой код, выдаёт ошибку. =\ Там пример с книги Юрова - Ассемблер. Если бы я понимал как сделать, я бы и сам помучался. А так я 0! 

Vitalka, переделывать сложнее чем писать

Не может быть - у меня работает. Что пишет???Попробовал твой код, выдаёт ошибку.
*provided AS IS
Вот в этом месте выдаёт.
CSeg segment <--- ТУТА!!!
assume cs:CSeg,ds:CSeg
org 100h
start:
mov ax,3
int 10h
CSeg segment <--- ТУТА!!!
assume cs:CSeg,ds:CSeg
org 100h
start:
mov ax,3
int 10h
Vitalka, хм... А что за компилятор? И что за ошибка?
Я компилирую так:
Я компилирую так:
tasm.exe thisfile.asm
tlink.exe /t thisfile.obj
*provided AS IS