我想在运行时输入一些命令行参数.喜欢
./program abc def ghi
Run Code Online (Sandbox Code Playgroud)
argc
在这种情况下将是4.没问题.但如果我这样做
./program abc def *
Run Code Online (Sandbox Code Playgroud)
甚至
./program * abc def
Run Code Online (Sandbox Code Playgroud)
变量argc
给我一个远大于4的值.
在打印整个argv
数组(不考虑第0个参数; ./program
)作为字符串时,我会得到一个列表,其中前两个元素是abc
,def
而其他元素都是工作目录中包含的文件的文件名.
我正在尝试从K&R学习C语言.我试图制作一个RPN计算器,我们可以给出类似的表达式./program 2 4 *
.
这是什么原因?或者我错了?
我正在从《计算机系统:程序员的视角》学习 x86-64 汇编,并且遇到了一个练习,要求将一行 C 代码转换为(两个)等效的汇编指令。该代码是关于使用指针将一种类型的变量复制到另一种类型的变量。
指针变量声明如下:
src_t *sp; //src_t and dest_t are typedefs
dest_t *dp;
Run Code Online (Sandbox Code Playgroud)
需要翻译的C代码是:
*dp = (dest_t)*sp;
Run Code Online (Sandbox Code Playgroud)
假设指针sp
和分别dp
存储在寄存器%rdi
和%rsi
中,并且我们应该设置%rax
(例如 、%eax
或%ax
)的“适当部分”%al
来进行中间数据复制(因为 x86-64 不允许源和目标同时复制)是内存引用)。
现在,当src_t
isunsigned char
和dest_t
is 时long
,我为其编写了以下汇编代码:
movzbq (%rdi), %rax //move a byte into %rax with zero extension
movq %rax, (%rsi) //move 8 bytes of 'long' data
Run Code Online (Sandbox Code Playgroud)
但这本书以及Godboltgcc
(与 一起使用-O3
)都说它应该是
movzbl (%rdi), %eax …
Run Code Online (Sandbox Code Playgroud)