汇编程序中的内存不可用?(TASM)

时间:2012-11-29 09:15:12

标签: assembly

正如我在书中读到的那样,通过地址[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的不可用内存,然后读取它。有什么问题?

1 个答案:

答案 0 :(得分:0)

第二条指令

     mov ax, [di] 

似乎假设ds指向段0.你想要的地址可能是绝对地址(realmode),所以0000:0002,所以请确保你保存一个段寄存器,加载0,然后在以上指示。

在更改段寄存器之前,先将其推入堆栈,然后再将其弹回。 (在您返回或致电其他程序或系统之前)