Ассемблер
нужна прога которая обеспечивает перевод введенного 10 речного числа в 16ричное и 2ичное в графическом режиме
а)четное число выводится синим цветом,не четное-красным.
б)вывод каждого числа осуществляется в окно с пояснительным комментарием соответствующего цвета.
все это нужно написать на асемблере
Кстати, сколько цифр должно быть в введенном числе?
Обычно учебные программы пишут под DOS.
Кстати, сколько цифр должно быть в введенном числе?
в том асм-е что я учила :) числа считывали в строках. все мелочи не помню, при вызове интерапта, который считывает строку, я ему адресс памяти
куда ее грузить + максимальный ее размер, в результате получаем введеную строку по указанному адресу + первый байт памяти отведенный
на сохранение числа строки содержал ее размер(максимум 255 символов)
в том асм-е что я учила :)
Просто если длина 3-4 десятичных цифры, то алгоритм упрощается.
Вот функция ввода
msgInputAddr dw ?;Это указатели на
MinusAddr dw ?;соответствующие
msgStringGivedAddr dw ?;данные
result_bin dw 0
ascbin proc
;==========================================================
;transmitting of the input addresses through data's segment
ascbin_begin:
push cx
mov al,0
mov si,word ptr [MinusAddr]
mov byte ptr [si],al
mov dx,word ptr [msgInputAddr]
mov ah,09h
int 21h
mov ax,0
push ax
ReadNextSymbol:
wait_any_key_0:
mov ah,06h
mov dl,0ffh
int 21h
jz wait_any_key_0
cmp al,2Dh
jne Symbol_not_equal_Minus
mov al,1
mov si,word ptr [MinusAddr]
mov byte ptr [si],al
mov ah,06h
mov dl,2Dh
int 21h
wait_any_key_n0:
mov ah,06h
mov dl,0ffh
int 21h
jz wait_any_key_n0
Symbol_not_equal_Minus:
cmp al,30h
jl NotDigitSymbol
cmp al,39h
jg NotDigitSymbol2
;DigitSymbol
mov ah,06h
mov dl,al
int 21h
sub al,30h
;DecimalDigit
mov bl,al
mov bh,0
pop ax
mov dl,10
mov dh,0
mul dx
add ax,bx
push ax
jmp ReadNextSymbol
NotDigitSymbol2:
mov dl,7
mov ah,06h
int 21h
jmp ReadNextSymbol
NotDigitSymbol:
nop
pop dx
mov si,word ptr [MinusAddr]
mov al,byte ptr [si]
cmp al,0
je SignZeroNot
;sign = 1
;converting in additional code
mov ax,dx
not ax ;inversion
add ax,1 ;+1
or ax,8000h ;sign't bit
mov dx,ax
SignZeroNot:
mov result_bin,dx
mov dx,word ptr [msgStringGivedAddr]
mov ah,09h
int 21h
pop cx
;output data come back through data's segment
ret
;=======================================================
ascbin endp
этот текст проги то что мне надо?
не сочтите меня по уши деревянной,но это,по идее,забивается в комп через командную строку,а как это сделать?
вот что оно мне выдает:
Microsoft Windows XP [Версия 5.1.2600]
(С) Корпорация Майкрософт, 1985-2001.
C:\Documents and Settings\Алина>cd\
C:\>cd aaa
C:\aaa>tasm bbb.asm
Turbo Assembler Version 4.1 Copyright (c) 1988, 1996 Borland International
Assembling file: bbb.asm
**Fatal** Command line: Can't locate file: bbb.asm
Error messages: 1
Warning messages: None
Passes: 1
Remaining memory: 454k
C:\aaa>
нужна прога которая обеспечивает... в графическом режиме
Обязательно в графическом? Может текстовой цветной пойдет? (там наработки есть)
P.S. Это не прога целиком, а только лишь функция ввода...
представь черный экран,на нем написано "введите число"
под этой строчкой начерчено окошко,в которое вводить,далее ниже написано "шестнадцатиричное" ниже окошко,где высвечивается оно,а еще ниже "двоичное" по той же схеме с окошком.
вот.
Если запускать не из-под Винды, то можно сделать с BIOS'ом
Так что сделал в стандартном текстовом. Могу в цветной текстовой перевести, в 16 цветов.
А с графикой, похоже придется сложнее. Скачал доков по EGA,VGA,SVGA, сижу, мозгую
stacksegment segment para stack 'stack'
dw 10h dup(?)
stacksegment ends
datasegment segment para public 'data'
;---------------- declarations of the variables -----------
msgInput db 'Input DEC',13,10,24h
msgStringGived db 13,10,'Ok',13,10,24h
result dw ?
Minus db 0
msgInputAddr dw ?
msgStringGivedAddr dw ?
MinusAddr dw ?
HEX_string db 'HEX: '
out_ db 4 dup(0),13,10,24h
BIN_string db 'BIN: '
out_2 db 16 dup(0),13,10,24h
;----------------------------------------------------------
datasegment ends
codesegment segment para public 'code'
assume cs:codesegment, ds:datasegment, ss:stacksegment
start:
mov ax,datasegment
mov ds,ax
mov ax,offset Minus
mov MinusAddr,ax
mov ax,offset msgInput
mov msgInputAddr,ax
mov ax,offset msgStringGived
mov msgStringGivedAddr,ax
call ascbin
mov bx,3
mov si,0
fill_out:
mov al,byte ptr [result+si]
inc si
mov cl,al
and al,0Fh
or al,30h
cmp al,39h
jbe next
add al,7
next:
mov byte ptr [out_+bx],al
dec bx
mov al,cl
and al,0F0h
shr al,4
or al,30h
cmp al,39h
jbe next_2
add al,7
next_2:
mov byte ptr [out_+bx],al
dec bx
cmp bx,0
jnl fill_out
mov dx,offset HEX_string
mov ah,09h
int 21h
mov bx,1
mov si,15
calc_:
mov ax,result
test ax,bx
jz zero_
mov dl,1
mov byte ptr[out_2+si],dl
zero_:
mov dl,30h
add byte ptr[out_2+si],dl
dec si
shl bx,1
cmp bx,0
jne calc_
mov dx,offset BIN_string
mov ah,09h
int 21h
;-------- exit ----
mov ax,4c00h
int 21h
;------------------
ascbin proc
;==========================================================
;transmitting of the input addresses through data's segment
ascbin_begin:
push cx
mov al,0
mov si,word ptr [MinusAddr]
mov byte ptr [si],al
mov dx,word ptr [msgInputAddr]
mov ah,09h
int 21h
mov ax,0
push ax
ReadNextSymbol:
wait_any_key_0:
mov ah,06h
mov dl,0ffh
int 21h
jz wait_any_key_0
cmp al,2Dh
jne Symbol_not_equal_Minus
mov al,1
mov si,word ptr [MinusAddr]
mov byte ptr [si],al
mov ah,06h
mov dl,2Dh
int 21h
wait_any_key_n0:
mov ah,06h
mov dl,0ffh
int 21h
jz wait_any_key_n0
Symbol_not_equal_Minus:
cmp al,30h
jl NotDigitSymbol
cmp al,39h
jg NotDigitSymbol2
;DigitSymbol
mov ah,06h
mov dl,al
int 21h
sub al,30h
;DecimalDigit
mov bl,al
mov bh,0
pop ax
mov dl,10
mov dh,0
mul dx
add ax,bx
push ax
jmp ReadNextSymbol
NotDigitSymbol2:
mov dl,7
mov ah,06h
int 21h
jmp ReadNextSymbol
NotDigitSymbol:
nop
pop dx
mov si,word ptr [MinusAddr]
mov al,byte ptr [si]
cmp al,0
je SignZeroNot
;sign = 1
;converting in additional code
mov ax,dx
not ax ;inversion
add ax,1 ;+1
or ax,8000h ;sign't bit
mov dx,ax
SignZeroNot:
mov result,dx ;lo byte from DX
mov dx,word ptr [msgStringGivedAddr]
mov ah,09h
int 21h
pop cx
;output data come back through data's segment
ret
;=======================================================
ascbin endp
codesegment ends
end start
stacksegment segment para stack 'stack'
dw 10h dup(?)
stacksegment ends
;colors
dark_blue = 1
green = 2
blue = 3
red = 4
bgBlue = 16
bgGreen = 32
bgLightBlue = 48
bgRed = 64
datasegment segment para public 'data'
;---------------- declarations of the variables -----------
msgInput db 'Input DEC',13,10,24h
msgStringGived db 'Ok',13,10,24h
result dw ?
Minus db 0
msgInputAddr dw ?
msgStringGivedAddr dw ?
MinusAddr dw ?
HEX_string db 'HEX: '
out_ db 4 dup(0),13,10,24h
BIN_string db 'BIN: '
out_2 db 16 dup(0),13,10,24h
video_out__temp dw 0
curr_sym db 0
;----------------------------------------------------------
datasegment ends
codesegment segment para public 'code'
assume cs:codesegment, ds:datasegment, ss:stacksegment
start:
mov ax,datasegment
mov ds,ax
mov ax,0B800h
mov es,ax
call VIDEOMEM_CLEAR
mov ax,offset Minus
mov MinusAddr,ax
mov ax,offset msgInput
mov msgInputAddr,ax
mov ax,offset msgStringGived
mov msgStringGivedAddr,ax
call ascbin
mov bx,3
mov si,0
fill_out:
mov al,byte ptr [result+si]
inc si
mov cl,al
and al,0Fh
or al,30h
cmp al,39h
jbe next
add al,7
next:
mov byte ptr [out_+bx],al
dec bx
mov al,cl
and al,0F0h
shr al,4
or al,30h
cmp al,39h
jbe next_2
add al,7
next_2:
mov byte ptr [out_+bx],al
dec bx
cmp bx,0
jnl fill_out
mov al,green
mov bx,offset HEX_string
call VIDEO_OUT_STRING
mov bx,1
mov si,15
calc_:
mov ax,result
test ax,bx
jz zero_
mov dl,1
mov byte ptr[out_2+si],dl
zero_:
mov dl,30h
add byte ptr[out_2+si],dl
dec si
shl bx,1
cmp bx,0
jne calc_
mov al,green
mov bx,offset BIN_string
call VIDEO_OUT_STRING
;-------- exit ----
mov ax,4c00h
int 21h
;------------------
ascbin proc
;==========================================================
;transmitting of the input addresses through data's segment
ascbin_begin:
push cx
mov al,0
mov si,word ptr [MinusAddr]
mov byte ptr [si],al
mov bx,word ptr [msgInputAddr]
mov al,green
call VIDEO_OUT_STRING
mov ax,0
push ax
ReadNextSymbol:
wait_any_key_0:
mov ah,06h
mov dl,0ffh
int 21h
jz wait_any_key_0
cmp al,2Dh
jne Symbol_not_equal_Minus
mov al,1
mov si,word ptr [MinusAddr]
mov byte ptr [si],al
mov ah,06h
mov dl,2Dh
int 21h
wait_any_key_n0:
mov ah,08h
int 21h
jz wait_any_key_n0
Symbol_not_equal_Minus:
cmp al,30h
jl NotDigitSymbol
cmp al,39h
jg NotDigitSymbol2
;DigitSymbol
mov curr_sym,al
mov bx,offset curr_sym
mov al,green
call VIDEO_OUT_SYMBOL
mov al,curr_sym
sub al,30h
;DecimalDigit
mov bl,al
mov bh,0
pop ax
mov dl,10
mov dh,0
mul dx
add ax,bx
push ax
jmp ReadNextSymbol
NotDigitSymbol2:
mov dl,7
mov ah,06h
int 21h
jmp ReadNextSymbol
NotDigitSymbol:
nop
pop dx
mov si,word ptr [MinusAddr]
mov al,byte ptr [si]
cmp al,0
je SignZeroNot
;sign = 1
;converting in additional code
mov ax,dx
not ax ;inversion
add ax,1 ;+1
or ax,8000h ;sign't bit
mov dx,ax
SignZeroNot:
mov result,dx ;lo byte from DX
mov di,video_out__temp
add di,160
mov ax,di
mov bl,160
div bl
xor ah,ah
mul bl
;in ax - rounded di (begin of the string)
mov di,ax
mov video_out__temp,di
mov bx,word ptr [msgStringGivedAddr]
mov al,green
call VIDEO_OUT_STRING
pop cx
;output data come back through data's segment
ret
;=======================================================
ascbin endp
VIDEO_OUT_STRING proc
mov di,video_out__temp
mov si,bx
label_video_out:
movsb
stosb
cmp byte ptr [si],13
jne no_13
;13
add di,160 ;80 symbols
inc si
no_13:
cmp byte ptr [si],10
jne no_10
;10
push ax
push bx
mov ax,di
mov bl,160
div bl
xor ah,ah
mul bl
;in ax - rounded di (begin of the string)
mov di,ax
pop bx
pop ax
inc si
no_10:
cmp byte ptr [si],24h ;'$'?
jne label_video_out
mov video_out__temp,di
ret
endp
VIDEO_OUT_SYMBOL proc
mov di,video_out__temp
mov si,bx
movsb
stosb
mov video_out__temp,di
ret
endp
VIDEOMEM_CLEAR proc
mov di,0
mov cx,4000
rep stosb
ret
endp
codesegment ends
end start
stacksegment segment para stack 'stack'
dw 10h dup(?)
stacksegment ends
;colors
dark_blue = 1
green = 2
blue = 3
red = 4
bgBlue = 16
bgGreen = 32
bgLightBlue = 48
bgRed = 64
datasegment segment para public 'data'
;---------------- declarations of the variables -----------
msgInput db 'Input DEC',13,10,24h
msgStringGived db 'Ok',13,10,24h
result dw ?
Minus db 0
msgInputAddr dw ?
msgStringGivedAddr dw ?
MinusAddr dw ?
HEX_string db 'HEX: '
out_ db 4 dup(0),13,10,24h
BIN_string db 'BIN: '
out_2 db 16 dup(0),13,10,24h
video_out__temp dw 0
curr_sym db 0
color db 0
;----------------------------------------------------------
datasegment ends
codesegment segment para public 'code'
assume cs:codesegment, ds:datasegment, ss:stacksegment
start:
mov ax,datasegment
mov ds,ax
mov ax,0B800h
mov es,ax
call VIDEOMEM_CLEAR
mov ax,offset Minus
mov MinusAddr,ax
mov ax,offset msgInput
mov msgInputAddr,ax
mov ax,offset msgStringGived
mov msgStringGivedAddr,ax
call ascbin
mov ax,result
test ax,1
jnz not_parity
;parity
mov color,blue
jmp after_par
not_parity:
mov color,red
after_par:
mov bx,3
mov si,0
fill_out:
mov al,byte ptr [result+si]
inc si
mov cl,al
and al,0Fh
or al,30h
cmp al,39h
jbe next
add al,7
next:
mov byte ptr [out_+bx],al
dec bx
mov al,cl
and al,0F0h
shr al,4
or al,30h
cmp al,39h
jbe next_2
add al,7
next_2:
mov byte ptr [out_+bx],al
dec bx
cmp bx,0
jnl fill_out
mov al,color
mov bx,offset HEX_string
call VIDEO_OUT_STRING
mov bx,1
mov si,15
calc_:
mov ax,result
test ax,bx
jz zero_
mov dl,1
mov byte ptr[out_2+si],dl
zero_:
mov dl,30h
add byte ptr[out_2+si],dl
dec si
shl bx,1
cmp bx,0
jne calc_
mov al,color
mov bx,offset BIN_string
call VIDEO_OUT_STRING
;-------- exit ----
mov ax,4c00h
int 21h
;------------------
ascbin proc
;==========================================================
;transmitting of the input addresses through data's segment
ascbin_begin:
push cx
mov al,0
mov si,word ptr [MinusAddr]
mov byte ptr [si],al
mov bx,word ptr [msgInputAddr]
mov al,green
call VIDEO_OUT_STRING
mov ax,0
push ax
ReadNextSymbol:
wait_any_key_0:
mov ah,06h
mov dl,0ffh
int 21h
jz wait_any_key_0
cmp al,2Dh
jne Symbol_not_equal_Minus
mov al,1
mov si,word ptr [MinusAddr]
mov byte ptr [si],al
mov ah,06h
mov dl,2Dh
int 21h
wait_any_key_n0:
mov ah,08h
int 21h
jz wait_any_key_n0
Symbol_not_equal_Minus:
cmp al,30h
jl NotDigitSymbol
cmp al,39h
jg NotDigitSymbol2
;DigitSymbol
mov curr_sym,al
mov bx,offset curr_sym
mov al,green
call VIDEO_OUT_SYMBOL
mov al,curr_sym
sub al,30h
;DecimalDigit
mov bl,al
mov bh,0
pop ax
mov dl,10
mov dh,0
mul dx
add ax,bx
push ax
jmp ReadNextSymbol
NotDigitSymbol2:
mov dl,7
mov ah,06h
int 21h
jmp ReadNextSymbol
NotDigitSymbol:
nop
pop dx
mov si,word ptr [MinusAddr]
mov al,byte ptr [si]
cmp al,0
je SignZeroNot
;sign = 1
;converting in additional code
mov ax,dx
not ax ;inversion
add ax,1 ;+1
or ax,8000h ;sign't bit
mov dx,ax
SignZeroNot:
mov result,dx ;lo byte from DX
mov di,video_out__temp
add di,160
mov ax,di
mov bl,160
div bl
xor ah,ah
mul bl
;in ax - rounded di (begin of the string)
mov di,ax
mov video_out__temp,di
mov bx,word ptr [msgStringGivedAddr]
mov al,green
call VIDEO_OUT_STRING
pop cx
;output data come back through data's segment
ret
;=======================================================
ascbin endp
VIDEO_OUT_STRING proc
mov di,video_out__temp
mov si,bx
label_video_out:
movsb
stosb
cmp byte ptr [si],13
jne no_13
;13
add di,160 ;80 symbols
inc si
no_13:
cmp byte ptr [si],10
jne no_10
;10
push ax
push bx
mov ax,di
mov bl,160
div bl
xor ah,ah
mul bl
;in ax - rounded di (begin of the string)
mov di,ax
pop bx
pop ax
inc si
no_10:
cmp byte ptr [si],24h ;'$'?
jne label_video_out
mov video_out__temp,di
ret
endp
VIDEO_OUT_SYMBOL proc
mov di,video_out__temp
mov si,bx
movsb
stosb
mov video_out__temp,di
ret
endp
VIDEOMEM_CLEAR proc
mov di,0
mov cx,4000
rep stosb
ret
endp
codesegment ends
end start