IPB
ЛогинПароль:

> ПРАВИЛА РАЗДЕЛА!!!

1. Заголовок или название темы должно быть информативным
2. Все тексты программ должны помещаться в теги [CODE=asm] [/CODE]
3. Прежде чем задавать вопрос, см. "FAQ",если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно, такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Ассемблера. Исключение только с согласия модератора.
5. НЕ используйте форум для личного общения! Все, что не относиться к обсуждению темы - на PM!
6. Проверяйте программы перед тем, как выложить их на форум!!

> перевод из 10ричной системы, есть ошибки
сообщение
Сообщение #1


Новичок
*

Группа: Пользователи
Сообщений: 34
Пол: Мужской

Репутация: -  0  +


программка переводит из 10ричной системы в 16,8,2ичные...кроме ответов на экран выводятся символы какие-то и после вывода не выходит сразу...Где-т ошибка sad.gif((
может кто-нибудь помочь с комментариями к этой программке rolleyes.gif ,т.к. в ассемблере я новичок,понятно,но н все - есть сомнения

.model tiny
.code
org 100h
start:

mov ax,6219
push ax
push ax

mov bx,16
lea si,string
call IntToStr
mov ah,9
lea dx,string
int 21h

pop ax
mov bx,8
lea si,string
call IntToStr
mov ah,9
lea dx,Break
int 21h

pop ax
mov bx,2
lea si,string
call IntToStr
mov ah,9
lea dx,Break
int 21h


mov ah,8
int 21h
ret
Break db 13,10
string db 64 dup('$')

IntToStr proc
;IN:
;ESI = address of the string to output the number
;EAX = nubmer to convert to string
;EBX = scale of notation
;
;OUT:
;number, converted to string at address, passed in ESI
;EBX = 0 if Error

;check scale of notation
cmp bx,9+26;9 digits and 26 letters
jae its_out_of_range

push dx
push di
push cx

its_sgn_plus:
xor cx,cx
mov di,si
its_repeat:
xor dx,dx
div bx
cmp dl,10
jge its_letter
add dl,30h
jmp its_notletter
its_letter:
add dl,41h-10
its_notletter:
mov byte ptr [di],dl
inc cx
inc di
test ax,ax
jne its_repeat

push cx
shr cx,1
jnc $+3
inc cx

its_invert_order:
dec di
mov dl,byte ptr [di]
mov al,byte ptr [si]
mov byte ptr [si],dl
mov byte ptr [di],al
inc si
dec cx ;loop its_invert_order
jnz its_invert_order
pop cx

pop cx
pop di
pop dx
ret

its_out_of_range:
xor bx,bx ;EBX = 0 if Error
ret

IntToStr endp
end start
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
 
 Ответить  Открыть новую тему 
Ответов
сообщение
Сообщение #2


N337
****

Группа: Пользователи
Сообщений: 737
Пол: Мужской

Репутация: -  26  +


Программа работает правильно: она выводит 3 строчки - шестнадцатеричное, восьмеричное и двоичное представление десятичного числа 6219, а затем ждет нажатия на любую клавишу (по задумке автора - чтобы можно было рассмотреть результат) и завершается.

Добавлено через 17 мин.
.model tiny
.code
org 100h
start:

mov ax,6219 ;ax = 6219 (число, которое надо перевести)
push ax ;сохраняем две его копии в стек
push ax

;перевод в шестнадцатеричный вид
mov bx,16 ;bx = 16 - основание системы, в которую надо перевести
lea si,string ;si указывает на буфер, в который надо записать строку - результат перевода
call IntToStr ;обращение к процедуре перевода
mov ah,9 ;вывод результата - системный вызов DOS int 21h/ah = 9 - вывод строки
lea dx,string
int 21h

;перевод в восьмеричный вид
pop ax ;ax = 6219 - копия из стека
mov bx,8
lea si,string
call IntToStr
mov ah,9
lea dx,Break
int 21h

;перевод в двоичный вид
pop ax
mov bx,2
lea si,string
call IntToStr
mov ah,9
lea dx,Break
int 21h

;ожидать нажатия любой клавиши
mov ah,8
int 21h

;выход из программы - переход на адрес PSP:0, по которому располагается системный
;вызов DOS int 20h - завершение работы программы
ret

Break db 13,10 ;последовательность символов CR, LF - переход на новую строку

string db 64 dup('$') ;буфер для записи результата перевода

;--- процедура записи числа в виде строки в заданной системе счисления ---
; (процедура откуда-то скопирована автором программы и переделана для 16-разрядного режима ЦП)
IntToStr proc
;Входные данные:
;SI = адрес буфера для вывода строки
;AX = число, которое надо преобразовать в строку
;BX = основание системы счисления
;
;Выходные данные:
;число, преобразованное в строку по адресу, указанному в SI
;BX = 0 в случае ошибки (если основание системы > 35 и десятичных цифр и латиских букв для записи числа недостаточно)

;проверка основания
cmp bx,9+26;9 цифр и 26 букв
jae its_out_of_range

push dx
push di
push cx

its_sgn_plus:
xor cx,cx
mov di,si
its_repeat:
xor dx,dx
div bx
cmp dl,10
jge its_letter
add dl,30h
jmp its_notletter
its_letter:
add dl,41h-10
its_notletter:
mov byte ptr [di],dl
inc cx
inc di
test ax,ax
jne its_repeat

push cx
shr cx,1
jnc $+3
inc cx

its_invert_order:
dec di
mov dl,byte ptr [di]
mov al,byte ptr [si]
mov byte ptr [si],dl
mov byte ptr [di],al
inc si
loop its_invert_order
pop cx

pop cx
pop di
pop dx
ret

its_out_of_range:
xor bx,bx ;EBX = 0 в лучае ошибки
ret

IntToStr endp
end start


--------------------
The idiots are winning.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

Сообщений в этой теме


 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 29.03.2024 2:38
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name