Подскажите в чем ошибки в лабе - 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

Объяснение кода листинга программы

  1. Переменная BIOSTick имеет тип dd, но в коде она не инициализируется, что может вызвать неопределенное поведение.
  2. Переменная HexStr имеет строковый тип (db), но в коде она используется как байтовый массив. Это может привести к ошибкам при работе с памятью.
  3. Переменная BinStr также имеет строковый тип (db), но в коде она используется как байтовый массив. Это может привести к ошибкам при работе с памятью.
  4. В процедуре ProcBinHex, переменная eax используется как счетчик, но не инициализируется. Это может привести к неопределенному поведению при первом использовании.
  5. В процедуре ProcBinHex, в цикле, происходит доступ к элементам массивов Hex и Bin по индексу, который не был инициализирован. Это может привести к ошибкам при работе с памятью.
  6. В процедуре ProcBinHex, после цикла, происходит попытка доступа к памяти по адресу es:[46Ch], который не был инициализирован. Это может привести к неопределенному поведению.
  7. В процедуре ProcBinHex, перед возвратом в основную программу, происходит попытка доступа к памяти по адресу es:[46Ch], который не был инициализирован. Это может привести к неопределенному поведению.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

13   голосов , оценка 4.154 из 5
Похожие ответы