0

.com プログラムの環境の作成に問題があります。es が psp の先頭を指すと、es:2ch に配置されます。これが私のコードです:

    org 100h
    mov cx,256
    mov ah,2


    xor si, si  ; si = 0
    mov si,[es:si]  ; si = begining of the psp
    sub si, 2ch ; adding 2ch offset to si
    mov si, [si]    ; making si point to com environement



loop1:   ; output chars until '0'
    mov dl, [si]
    inc si      
    cmp dl, '0' 
    je end_of_program           
    int 21h

loop loop1



end_of_program:
    mov ah, 0
    int 16h 

    mov ah, 4ch
    int 21h

出力:

R♥˙{  T♥ |      `♦­☺Ç☻  ▼ ţ☺  IT
♦☻  NLł☻  PO┬☺  NO×☻  CFÓ☻  SV┤☻  SU╩☻  LA▲♥  DV4♥  RU÷☻  BRJ♥
HUĘ♥  ISż♥  PLď♥  ROŕ♥  SL ♦  YU▬♦  TRB♦  ETn♦  JPX♦  USä♦
4

2 に答える 2

2

思い出すと、PSP:2Ch の「環境」はセグメント アドレスです。即値またはレジスタを使用して segreg をロードすることはできませんが、メモリからロードすることはできます...

mov ds, [2Ch]

次に、オフセット 0 から開始するループを実行します。これにより、最初の環境変数のみが出力されます。そのループが終了したら、別の 0 を確認します。そうでない場合は、ループを再度実行します (CR/LF をスローする必要がある場合があります)。二重のゼロに到達すると、別の単語 (?) があり、次にプログラム名があります。もちろん、この時点で ds は失われています...しかし、cs と es はどちらもまだ元の PSP を指しているので、必要に応じて簡単に復元できます...

于 2013-03-13T10:11:33.017 に答える
0

ウィキペディアのProgram_Segment_Prefixエントリを参照してください。

プログラムの実行時に、PSP のセグメント アドレスが DS レジスタに渡されます。
...
あるいは、オフセット 100h にロードされた .COM プログラムでは、上記のオフセットを使用するだけで PSP を直接アドレス指定できます。オフセット 000h は PSP の先頭を示し、0FFh は末尾を示します。

したがって、たとえば、オフセット 81h 以降からプログラムを開始するために使用されたコマンドを読み取ることができます。

于 2013-03-13T08:51:55.363 に答える