【问题标题】:How to read command line arguments in assembly language?如何用汇编语言读取命令行参数?
【发布时间】:2018-10-17 16:04:40
【问题描述】:

我正在使用 TASM 汇编程序,但我似乎找不到保存命令行参数甚至输出它们的方法。我尝试在dx=0081hah=09h 时做int 21h。尽管我已经读到这是这样做的方法,但它什么也没做。

我添加了我认为应该可以复制和显示我输入的参数的代码:

mov dx, 81h
mov ah, 09h
int 21h

【问题讨论】:

  • 请指定您的目标环境(操作系统或独立)。
  • int 21h/ah=81h 在这里不是一个 DOS 中断。你认为它会做什么?
  • 还在Minimal, Complete and Verifiable Example 中提供您当前的方法。
  • 你还没读过here。试试我的例子here..
  • @MichaelPetch 我弄错了,我的错,啊=09h,dx=81h

标签: assembly dos x86-16 tasm command-line-arguments


【解决方案1】:

命令行位于Program Segment Prefix (PSP),从位置81h开始。在位置 80h,您可以找到字符串的长度。这个字符串总是以0Dh结尾,而不是$(如果你想使用int 21h/ah=09h,请注意这一点)。

在 .exe 程序开始时,段寄存器 DSES 指向该 PSP。这就是为什么您必须在程序开头使用 DATA 段 (mov ax, @data;mov ds, ax) 加载 DS 的原因。让我们跳过那个:

MODEL small
.STACK 100h

.CODE

main PROC

    ; http://www.ctyme.com/intr/rb-2791.htm
    mov ah, 40h         ; DOS 2+ - WRITE - WRITE TO FILE OR DEVICE
    mov bx, 1           ; File handle = STDOUT
    xor ch, ch
    mov cl, ds:[0080h]  ; CX: number of bytes to write
    mov dx, 81h         ; DS:DX -> data to write (command line)
    int 21h             ; Call MSDOS

    ; http://www.ctyme.com/intr/rb-2974.htm
    mov ax, 4C00h       ; AH=4Ch, AL=00h -> exit (0)
    int 21h             ; Call MSDOS
main ENDP

END main

【讨论】:

  • @rknb,在执行mov cl, ds:[0080h]mov dx, 81h 时,我们正在处理内存中的相邻位置,对吧?当我从第一行删除 ds 时 - 程序停止正常工作。但是为什么我们可以从第二行省略段名,它仍然有效?
  • @OlgaZhukova:是的。这是 TASM 特性的解决方法。如果您只写“mov cl, [0080h]”,则会收到警告“[Constant] assumed to mean immediate constant”,并且 TASM 将该行组合成“mov cl, 80h”。在第二行中,我只向 MSDOS 发送一个常量,稍后将使用 DS:DX 作为地址。
最近更新 更多