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をoffset=2の使用できないメモリに書き込んでから、正しく読み取ります。なにが問題ですか?

4

1 に答える 1

0

二度目の命令

     mov ax, [di] 

ds はセグメント 0 を指していると想定しているようです。必要なアドレスはおそらく絶対アドレス (リアルモード) にあるため、0000:0002 であるため、セグメント レジスタを保存し、0 をロードして、上記の命令でそれを使用するようにしてください。

セグメント レジスタを変更する前に、まずスタックにプッシュし、後でポップします。(別のプロシージャまたはシステムに戻るか呼び出す前に)

于 2012-11-29T10:27:31.293 に答える