0

正如我在书中读到的,通过地址 [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 写入偏移量 = 2 的不可用内存,然后正确读取。怎么了?

4

1 回答 1

0

第二条指令

     mov ax, [di] 

似乎假设 ds 指向段 0。您想要的地址可能在绝对地址(实模式)上,因此是 0000:0002,因此请确保保存一个段寄存器,用 0 加载它,并在上面的指令中使用它。

在更改段寄存器之前,先将其压入堆栈,然后再将其弹出。(在您返回或调用另一个过程或系统之前)

于 2012-11-29T10:27:31.293 回答