【问题标题】:Writing .com program's environment (NASM)编写 .com 程序的环境 (NASM)
【发布时间】:2013-03-01 02:18:35
【问题描述】:

我在编写 .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ä♦

【问题讨论】:

    标签: assembly x86 nasm dos


    【解决方案1】:

    请参阅 Wikipedia 上的 Program_Segment_Prefix 条目。

    PSP的段地址在程序执行时传入DS寄存器中。
    ...
    或者,在以偏移量 100h 加载的 .COM 程序中,只需使用上面列出的偏移量即可直接寻址 PSP。偏移量 000h 指向 PSP 的开头,0FFh 指向结尾等。

    所以你可以例如从偏移量 81h 及以后读取用于启动程序的命令。

    【讨论】:

      【解决方案2】:

      我记得,PSP:2Ch 的“环境”是一个段地址。虽然我们无法使用立即数或寄存器加载隔离,但我们可以从内存中加载...

      mov ds, [2Ch]
      

      然后从偏移量 0 开始执行循环。这只会打印您的第一个环境变量。当该循环结束时,检查另一个 0。如果没有,请再次运行您的循环(可能需要输入 CR/LF)。当你到达双零时,还有另一个词(?),然后是程序名称。当然,此时我们已经失去了 ds...但是 cs 和 es 仍然指向我们原来的 PSP,所以如果需要的话可以很容易地恢复它...

      【讨论】:

      • 我的输出还好吗?它是第一个变量吗?应该是这样的吗?
      猜你喜欢
      • 2016-08-06
      • 1970-01-01
      • 2011-10-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-23
      相关资源
      最近更新 更多