-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathMemTest.asm
75 lines (68 loc) · 1.62 KB
/
MemTest.asm
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
;Matheus Lima
;Escreve nos primeiros 64K de endereço e lê o dado escrito nesses endereços.
;O objetivo é detectar falhas na montagem da memória RAM
dados segment at 0000H
dados ends
assume ds:dados
codigo segment at 0F000H
org 0000H
inicio label far ;Aqui eu criei um label far, que pode ser usado no jmp para ir para um segmento e um offset específico
codigo ends
assume cs:codigo
.model small
.data
memValue equ 0FFH
.code
call memoryTest
pop dx
cmp dx,0
jnz sucess
;Coloca em dx o endereço de memória que deu erro
pop dx
sucess:
mov ax,0
memoryTest proc near
;Desempilha o endereço da instrução seguinte à chamada da procedure memoryTest
pop dx
mov ax, 0
mov ds, ax
mov cx, 0FFFFH
mov bx, 0FFFFH
mov ax, memValue
;Escreve memValue (0FFH) nos primeiros 64K de memória (0FFFFH)
write:
mov [bx],ax
dec bx
loop write
mov cx, 0FFFFH
mov bx, 0FFFFH
;Lê toda memória que foi anteriormente escrita para buscar algum valor diferente
;do que foi escrito. Isso indica problemas na memória, como erro na montagem ou
;pino defeituoso
read:
mov ax,[bx]
cmp ax,memValue
;Se leu diferente do que foi escrito, há erro na memória
jnz memoryError
dec bx
loop read
;Se chegou aqui, não encontrou erro na memória. Empilha o valor 0, que indica sucesso
mov ax, 0
push ax
exit:
;Empilha o endereço da instrução seguinte à chamada da procedure memoryTest
push dx
ret
memoryError:
;Empilha o endereço de memória em que foi encontrado divergência entre o valor
;escrito e o valor lido
push bx
;Empilha o valor 1, que indica erro
mov ax,1
push ax
jmp exit
memoryTest endp
org 0FFF0H
nop
jmp far ptr inicio
end