Подскажите в чем ошибки в лабе - Assembler
Формулировка задачи:
Определите подпрограмму для вывода на экран двойного слова в шестнадцатеричном виде и
подпрограмму для вывода на экран двойного слова в двоичном виде. В сегменте данных определите
четырех байтовую переменную Р1, содержащую нулевое значение. Запишите в переменную Р1
содержимое четырех байтового поля с физическим адресом 46СН ( в этом поле хранится системное
время). Используя подпрограммы выведите на экран значение Р1.
Поучилось вот так но преподаватель говорить что не те команды используются ... если что компелируется в TASM
MASM model small .stack 256 .data p1 dd ? TABL DB '0123456789ABCDEF' VI DB '******** $' per DB 10,13,'$' .code vivod proc .486 pusha push ax mov cx,4 mov si,7 m1: push ax AND AL,0FH ; обнуляем старшую часть al LEA BX,TABL ; преобразуем последную числа в шестнадцатеричный вид XLAT ; MOV VI[si],AL ; dec si POP EAX ; восстанавливаем значение ax из стека PUSH EAX ; сохраняем данные в регистрe ax SHR AL,4 ; перемещаем старшую часть байта в младшую LEA BX,TABL ; преобразуем первую числа в шестнадцатеричный вид XLAT ; MOV VI[si],AL dec si pop ax shr ax,8 loop m1 MOV AH,9 ; LEA DX,VI ; выводим полученное значение INT 21H ; pop eax mov cx,32 m2: shl ax,1; выполняем логический сдвиг влево на один байт push ax ; сохроняем данные в регистрe ax mov dl,0; записываем 0 в dl adc dl,0; add dl,30h; преобразуем в число mov ah,02h; вывод в двоичном виде int 21h; pop ax;восстанавливаем значение ax из стека loop m2 POPA ret vivod ENDp main: mov ax,@data mov ds,ax .386 mov ax,040h mov es,ax mov eax,dword ptr es:[06ch] mov p1,eax call vivod push eax mov ah,9 lea dx,per int 21h pop ax ror ax,8 call vivod ; выводим значения mov ah,7 int 21h mov ax,4c00h int 21h end main
Решение задачи: «Подскажите в чем ошибки в лабе»
textual
Листинг программы
.286 .model small .stack 100h .data BIOSTick dd ? Hex db '0123456789ABCDEF' Bin db '01' HexStr db '12345678',0Ah,0Dh,'$' BinStr db 8*4 dup (' '),0Ah,0Dh,'$' .code HexBin: mov ax,@data mov ds,ax mov ax, 03 int 10h xor ax,ax mov es,ax call ProcBinHex mov dx,offset HexStr mov ah,9 int 21h mov dx,offset BinStr mov ah,9 int 21h xor ax,ax int 16h mov ax,4C00h int 21h ; ProcBinHex Proc near .386 mov eax,es:[46Ch] ;счетчик тиков push eax mov esi,offset HexStr mov ecx,8 @@1: rol eax,4 mov ebx,eax and ebx,0Fh mov dl,byte ptr Hex[ebx] mov byte ptr [esi],dl inc esi loop @@1 pop eax mov esi,offset BinStr mov ecx,8*4 @@2: rol eax,1 mov ebx,eax and ebx,1 mov dl,byte ptr Bin[ebx] mov byte ptr [esi],dl inc esi loop @@2 .286 ret ProcBinHex EndP end HexBin
Объяснение кода листинга программы
- Переменная BIOSTick имеет тип dd, но в коде она не инициализируется, что может вызвать неопределенное поведение.
- Переменная HexStr имеет строковый тип (db), но в коде она используется как байтовый массив. Это может привести к ошибкам при работе с памятью.
- Переменная BinStr также имеет строковый тип (db), но в коде она используется как байтовый массив. Это может привести к ошибкам при работе с памятью.
- В процедуре ProcBinHex, переменная eax используется как счетчик, но не инициализируется. Это может привести к неопределенному поведению при первом использовании.
- В процедуре ProcBinHex, в цикле, происходит доступ к элементам массивов Hex и Bin по индексу, который не был инициализирован. Это может привести к ошибкам при работе с памятью.
- В процедуре ProcBinHex, после цикла, происходит попытка доступа к памяти по адресу es:[46Ch], который не был инициализирован. Это может привести к неопределенному поведению.
- В процедуре ProcBinHex, перед возвратом в основную программу, происходит попытка доступа к памяти по адресу es:[46Ch], который не был инициализирован. Это может привести к неопределенному поведению.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д