获取命令行参数

  1. psp的值默认保存在DS,ES
  2. 80h保存参数的长度,81h开始保存参数,最长128byte
  3. 代码处DS:[80],如果没有段前缀不行,默认的前缀不就是DS吗??
  4. 输入的参数前面会多出一个空格不解?这个不知有什么含义?

代码
ASSUME CS:CODES
CODES SEGMENT
param db
128 dup(?)
START:
xor cx,cx
mov cl,ds:[80H]
jcxz _exit
cld
push cs
pop es
mov si,81H
mov di,offset param
rep movsb
mov al,'$'
stosb
push cs
pop ds
mov dx,offset param
mov ah,9
int 21h
_exit:
MOV AH,4CH
INT 21H
CODES ENDS
END START

 

转载于:https://www.cnblogs.com/Jekhn/archive/2010/12/17/1909414.html

<think>嗯,用户想知道如何在Golang中获取命令行参数。我需要先回忆一下Golang的标准库里有哪个包是用来处理命令行参数的。对了,os包里的Args应该可以,还有flag包更高级一些。用户可能需要基础的示例,所以我应该先讲os.Args的用法,然后再提到flag包更灵活的功能。 首先,os.Args是一个字符串切片,第一个元素是程序名,后面的才是用户输入的参数。记得要检查参数数量,否则访问超出索引会panic。比如用户没有输入足够的参数时,给出提示信息,类似示例中的Usage函数。 然后,flag包适合需要解析标志的情况,比如带选项的参数。比如像-username=John这样的形式。flag.String或flag.StringVar可以定义变量绑定,然后调用flag.Parse()来解析。这样用户就可以更方便地处理带选项的命令行参数了。 要注意的是,用户可能分不清os.Args和flag包的区别,需要解释清楚两者的适用场景。os.Args适合简单的情况,直接获取参数;flag包适合需要复杂解析,比如有多个标志、默认值、帮助信息等。 另外,引用中提到的示例代码可能存在格式问题,比如HTML转义字符<,应该转换成<符号。在回答时要修正这些,确保代码正确无误。 用户可能还会关心参数的验证和错误处理,比如参数不够时的处理方式。需要提醒他们在实际应用中做好校验,避免程序崩溃。同时,flag包自动生成帮助信息,可以简化开发。 最后,生成的相关问题要围绕用户可能进一步的需求,比如参数类型转换、处理布尔参数、最佳实践等,这样能帮助他们深入学习。</think>### 在Golang中获取命令行参数的步骤说明 #### 一、使用`os.Args`基础方法 1. **导入包** ```go import ( "os" "fmt" ) ``` `os`包提供操作系统相关功能,`fmt`用于格式化输出。 2. **获取参数列表** ```go args := os.Args // 返回字符串切片 ``` - `os.Args[0]`是程序名称 - `os.Args[1]`是第一个实际参数 - 参数数量通过`len(os.Args)`判断 3. **参数校验示例** ```go if len(os.Args) < 3 { fmt.Println("Usage: ./program [name] [age]") return } name := os.Args[1] age := os.Args[2] ``` #### 二、使用`flag`包进阶方法(推荐) 1. **定义参数绑定** ```go var username string var port int flag.StringVar(&username, "u", "guest", "用户名") // 参数说明 flag.IntVar(&port, "p", 8080, "端口号") ``` 2. **解析参数** ```go flag.Parse() // 必须调用才会生效 ``` - 支持`-u=john -p=80`或`--u john --port 80`格式 - 自动生成`-h`帮助信息 3. **验证参数示例** ```go if port < 1 || port > 65535 { flag.Usage() // 调用默认帮助信息 os.Exit(1) } ``` #### 三、完整代码对比 ```go // os.Args版本 package main import "os" func main() { if len(os.Args) != 3 { println("需要2个参数:姓名 年龄") return } println("姓名:", os.Args[1], "年龄:", os.Args[2]) } // flag包版本 package main import "flag" func main() { name := flag.String("name", "", "用户姓名(必填)") age := flag.Int("age", 0, "用户年龄") flag.Parse() if *name == "" || *age == 0 { flag.PrintDefaults() return } println("姓名:", *name, "年龄:", *age) } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值