正如我在书中读到的那样,通过地址[2]我们可以找到不可用内存的第一个字节的地址。 我尝试写一些东西,然后阅读它。如果我没有犯错,我就做了这个操作。那么汇编程序中的内存不可用?
CODE SEGMENT
ASSUME CS:CODE, DS:CODE, ES:NOTHING
org 256
;------start-------
STARTPROC PROC
mov di, 2
;in ax is adress of unavailible byte
mov ax, [di]
;now es point on unavailable memory
mov es, ax
mov bx, 0FFFFh
;write with offset=2
mov es:[di], bx
;read es:[di]
mov ax, es:[di]
mov di, offset temp
add di, 3
call WRD_TO_HEX
mov dx, offset temp
mov ah, 09h
int 21h
ret
STARTPROC ENDP
temp db 4 DUP ('0'), '$'
TETR_TO_HEX PROC near
and AL, 0Fh
cmp AL, 09
jbe NEXT
add AL, 07
NEXT:add AL, 30h
ret
TETR_TO_HEX ENDP
BYTE_TO_HEX PROC near
push CX
mov AH, AL
call TETR_TO_HEX
xchg AL,AH
mov CL, 4
shr AL, CL
call TETR_TO_HEX
pop CX
ret
BYTE_TO_HEX ENDP
WRD_TO_HEX PROC near
push BX
mov BH, AH
call BYTE_TO_HEX
mov [DI], AH
dec DI
mov [DI], AL
dec DI
mov AL, BH
call BYTE_TO_HEX
mov [DI], AH
dec DI
mov [DI], AL
pop BX
ret
WRD_TO_HEX ENDP
CODE ENDS
end STARTPROC
需要Proc TETR_TO_HEX,BYTE_TO_HEX,WRD_TO_HEX来解析信息。
我将FFFF写入offset = 2的不可用内存,然后读取它。有什么问题?
答案 0 :(得分:0)
第二条指令
mov ax, [di]
似乎假设ds指向段0.你想要的地址可能是绝对地址(realmode),所以0000:0002,所以请确保你保存一个段寄存器,加载0,然后在以上指示。
在更改段寄存器之前,先将其推入堆栈,然后再将其弹回。 (在您返回或致电其他程序或系统之前)