目標:
我需要編寫一個程序,測試整個1MB內存的寫入功能,逐字節地爲一個系統使用英特爾80186微處理器。換句話說,我需要向內存中的每個字節寫入0,然後檢查是否實際寫入了0。然後,我需要使用值1重複此過程。最後,任何未成功寫入0或1的內存位置都需要存儲在堆棧中。x86程序集:編寫一個程序來測試整個1MB內存的內存功能
討論:
我是一名電子工程專業的大學生(不是計算機科學專業),而且對於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.我需要確定最高的RAM位置。
計劃:
1.在一個循環:寫0000H到存儲位置,在那個位置MEM校驗值,ES和DI的PUSH
值到堆棧,如果檢查失敗。
2.在循環中:將FFFFH寫入內存位置,檢查該內存位置的值,如果檢查失敗,則檢查堆棧中ES和DI的值爲PUSH
。
源代碼實施預案:
;****************************************************************************
;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,您可以在哪裏保存您正在測試的區域? – 2014-10-08 02:40:41
他是否讓你離開這條指令? 'CMP CX,10000h' – 2014-10-08 02:43:21
首先,關於Req沒有指定區域。其次,我相信'CMP CX,10000H'是允許的。有沒有理由不應該這樣? – Ben 2014-10-10 17:56:38