Crousader
Newbie | Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору Помогите разобарться пожалуйста. Нужно написать программу умножения 16-х чисел на 3. Скажите, пожалуйста, где базовая ошибка. Возможно, тут написан полный бред так как это моя первая программа на Ассемблере. Заранее спасибо! Вот мой код: masm model small .data message db 0dh,0ah,"VVedite chislo (16)" vuvod db 0dh,0ah,"Resultat: $" end_question db 0dh,0ah,"Hotite povtorit? ('y'- yes) $" .stack 256 .code convert_char: sub al,'0' ;вычитаем из символа ASCII-код нуля cmp al,10 ;если разность меньше 10, то была ;десятичная цифра - больше ничего не нужно ;делать jb done ;команда JB - переход, если меньше ;иначе - была буква add al,'0' ;AL=исходная буква and al,0x5f ;приводим ее к верхнему регистру sub al,'A'-10 ;получаем диапазон от 10 and al,0x0f ;вернуть нужное значение 0-15. Если ;буква больше F, то ;очищаем 4 старших бита AL done: ret ;возвращаемся HexDigit: cmp dl,10 jb .less add dl,'A'-10 ret .less: or dl,'0' ret main proc ;початок процедури main mov ax,@data ;фізична адреса сегмента даних в регістр ах mov ds,ax ;ах записуємо в ds vvod: mov ax,0003h ;очистка екрану mov dx,offset message ;загрузка адреси строки message int 21h ;вивід запрошення до вводу push esi ;сохраняем указатель в стеке xor eax,eax ;EAX = 0 xor ebx,ebx ;EBX = 0: накопитель для числа cmp byte [esi],'-' ;число отрицательное? jnz .next ;если нет, не пропускаем следующий ;символ inc esi ;пропускаем символ '-' .next: lodsb ;читаем цифру в AL or al,al ;конец строки? jz .done call convert_char ;преобразовать в число и сохранить ;его в AL imul ebx,16 ;умножить EBX на 16, сохранить в EBX add ebx,eax ;сложить jmp short .next ;и повторить .done: xchg ebx,eax ;поместить накопленное число в EAX pop esi ;восстановить исходное значение ESI cmp byte [esi],'-' ;результат должен быть отрицательным? jz .negate ;да, выполним отрицание ret .negate: neg eax ;выполняем отрицание ret ;все! lea eax,[eax*3] pushad xor esi,esi converted_loop: xor edx,edx div 16 call HexDigit push edx inc esi test eax,eax jnz converted_loop cld write_loop: pop eax stosb dec esi test esi,esi jnz write_loop mov byte [edi],0 popad ret jmp end_cont ;перехід до мітке end_cont end_cont: mov dx,offset end_question ;загрузка адреси строки end_question mov ah,9 int 21h ;вивід строки end_question на екран xor ah,ah ;очистка ah mov ah,01h int 21h ;ввід користувачем умови cmp al,'y' ;якщо натиснули "у" je vvod ;перехід в початок програми і повтор її дій mov ax,4c00h int 21h ;завершеня програми endp main end main |