Цель:
Мне нужно написать программу, которая проверяет функциональность записи всего 1 МБ памяти на основе байта по байтам для системы, использующей Микропроцессор Intel 80186. Другими словами, мне нужно записать от 0 до каждого байта в памяти, а затем проверить, действительно ли было написано 0. Затем мне нужно повторить процесс, используя значение 1. Наконец, любые ячейки памяти, у которых не было успешно записано 0 или 1, записанное в них во время их соответствующей операции записи, должны храниться в стеке.x86 Сборка: написание программы для проверки функциональности памяти для всего 1 МБ памяти
Обсуждение:
Я студентка по электротехнике в колледже (не компьютерная наука) и относительно новичок в ассемблере x86 и MASM611. Я не ищу полного решения. Однако мне понадобятся некоторые рекомендации.
Раньше в семестре я написал программу, которая заполнила часть памяти 0. Я считаю, что это будет хорошей отправной точкой для моего текущего проекта.
Исходный код для программы раннего:
;****************************************************************************
;Program Name: Zeros
;File Name: PROJ01.ASM
;DATE: 09/16/14
;FUNCTION: FILL A MEMORY SEGMENT WITH ZEROS
;HISTORY:
;AUTHOR(S):
;****************************************************************************
NAME ZEROS
MYDATA SEGMENT
MYDATA ENDS
MYSTACK SEGMENT STACK
DB 0FFH DUP(?)
End_Of_Stack LABEL BYTE
MYSTACK ENDS
ASSUME SS:MYSTACK, DS:MYDATA, CS:MYCODE
MYCODE SEGMENT
START: MOV AX, MYSTACK
MOV SS, AX
MOV SP, OFFSET End_Of_Stack
MOV AX, MYDATA
MOV DS, AX
MOV AX, 0FFFFh ;Moves a Hex value of 65535 into AX
MOV BX, 0000h ;Moves a Hex value of 0 into BX
CALL Zero_fill ;Calls procedure Zero_fill
MOV AX, 4C00H ;Performs a clean exit
INT 21H
Zero_fill PROC NEAR ;Declares procedure Zero_fill with near directive
MOV DX, 0000h ;Moves 0H into DX
MOV CX, 0000h ;Moves 0H into CX. This will act as a counter.
Start_Repeat: INC CX ;Increments CX by 1
MOV [BX], DX ;Moves the contents of DX to the memory address of BX
INC BX ;Increments BX by 1
CMP CX, 10000h ;Compares the value of CX with 10000H. If equal, Z-flag set to one.
JNE Start_Repeat ;Jumps to Start_Repeat if CX does not equal 10000H.
RET ;Removes 16-bit value from stack and puts it in IP
Zero_fill ENDP ;Ends procedure Zero_fill
MYCODE ENDS
END START
Требования:
1. Наймите явная структура сегмента.
2. Используйте пару регистров ES: DI для обращения к области тестовой памяти.
3. Неразрушающий доступ: перед тестированием каждого места памяти мне нужно сохранить исходное содержимое байта. Который должен быть восстановлен после завершения тестирования.
4. Мне нужно сохранить адреса любых мест памяти, которые не прошли тест в стеке.
5. Мне нужно определить наивысшее местоположение ОЗУ.
План:
1. В цикле: Write 0000H в ячейку памяти, Проверьте значение в этом месте ими памятью, PUSH
значения ES и DI в стек, если проверка не удалась.
2. В цикле: записать FFFFH в ячейку памяти, проверить значение в этом месте памяти, PUSH
значений ES и DI в стеке, если проверка завершилась неудачно.
Исходный код Исполнительное Предварительный план:
;****************************************************************************
;Program Name: Memory Test
;File Name: M_TEST.ASM
;DATE: 10/7/14
;FUNCTION: Test operational status of each byte of memory between a starting
; location and an ending location
;HISTORY: Template code from Assembly Project 1
;AUTHOR(S):
;****************************************************************************
NAME M_TEST
MYDATA SEGMENT
MYDATA ENDS
MYSTACK SEGMENT STACK
DB 0FFH DUP(?)
End_Of_Stack LABEL BYTE
MYSTACK ENDS
ESTACK SEGMENT COMMON
ESTACK ENDS
ASSUME SS:MYSTACK, DS:MYDATA, CS:MYCODE, ES:ESTACK
MYCODE SEGMENT
START: MOV AX, MYSTACK
MOV SS, AX
MOV SP, OFFSET End_Of_Stack
MOV AX, MYDATA
MOV DS, AX
MOV AX, FFFFH ;Moves a Hex value of 65535 into AX
MOV BX, 0000H ;Moves a Hex value of 0 into BX
CALL M_TEST ;Calls procedure M_TEST
MOV AX, 4C00H ;Performs a clean exit
INT 21H
M_TEST PROC NEAR ;Declares procedure M_TEST with near directive
MOV DX, 0000H ;Fill DX with 0's
MOV AX, FFFFH ;Fill AX with 1's
MOV CX, 0000H ;Moves 0H into CX. This will act as a counter.
Start_Repeat: MOV [BX], DX ;Moves the contents of DX to the memory address of BX
CMP [BX], 0000H ;Compare value at memory location [BX] with 0H. If equal, Z-flag set to one.
JNE SAVE ;IF Z-Flag NOT EQUAL TO 0, Jump TO SAVE
MOV [BX], AX ;Moves the contents of AX to the memory address of BX
CMP [BX], FFFFH ;Compare value at memory location [BX] with FFFFH. If equal, Z-flag set to one.
JNE SAVE ;IF Z-Flag NOT EQUAL TO 0, Jump TO SAVE
INC CX ;Increments CX by 1
INC BX ;Increments BX by 1
CMP CX, 10000H ;Compares the value of CX with 10000H. If equal, Z-flag set to one.
JNE Start_Repeat ;Jumps to Start_Repeat if CX does not equal 10000H.
SAVE: PUSH ES
PUSH DI
RET ;Removes 16-bit value from stack and puts it in IP
M_TEST ENDP ;Ends procedure Zero_fill
MYCODE ENDS
END START
Мои комментирования могут быть не точными.
Вопросы:
1. Как использовать ES: DI для обращения к области тестовой памяти?
2. Каков наилучший способ удержать исходное значение памяти, чтобы я мог его заменить, когда я закончил тестирование определенной ячейки памяти? Я считаю, что регистры AX-DX уже используются.
Кроме того, если у меня есть обновленный код и вопросы, следует ли разместить его в этой же теме или создать новое сообщение со ссылкой на эту ссылку?
Любые другие советы были бы весьма полезными.
Спасибо заранее.
Что касается требования № 3, где вы можете сохранить эту область, которую вы тестируете? –
Он отпустил вас с этой инструкцией? 'CMP CX, 10000h' –
Во-первых, ни одна область не указана в отношении Req. 3. Во-вторых, я считаю, что «CMP CX, 10000H» разрешено. Есть ли причина, которой это не должно быть? – Ben