小编Ray*_*oal的帖子

使用GNU Assember Intel语法进行内存寻址

我读过这个页面,其中包含了针对GAS的英特尔和AT&T语法之间的差异的良好列表,但它没有涵盖仅指定具有位移的地址的情况.

在这里,我用AT&T语法组装了四行:

                         .text
0000 48C7C008000000      mov    $8, %rax
0007 488B042508000000    mov    (8), %rax
000f 4889F0              mov    %rsi, %rax
0012 488B06              mov    (%rsi), %rax
Run Code Online (Sandbox Code Playgroud)

正如预期的那样,前两行是不同的.第一个将立即值8移动到rax中,第二个将地址8的内容移动到rax中.但是使用Intel语法我会得到以下奇怪的行为:

                         .text
                         .intel_syntax
0000 48C7C008000000      mov    %rax, 8
0007 48C7C008000000      mov    %rax, [8]
000e 4889F0              mov    %rax, %rsi
0011 488B06              mov    %rax, [%rsi]
Run Code Online (Sandbox Code Playgroud)

这里第一行和第二行汇编到相同的机器代码!首先我认为方括号是错误的,所以我在测试中添加了第三行和第四行,并且方括号对于内存寻址至少在涉及寄存器时起作用.

我读过的所有文档都显示了至少有一个基址或索引寄存器的内存寻址示例,有时还有一个比例和位移,但从不仅仅是位移.

我确实有使用NASM汇编程序的英特尔语法经验,它可以区分mov rax, 8mov rax, [8].

这是GAS中的错误吗?或者如果没有,我如何指定NASM的等效物mov rax, [8]

我意识到指定一个仅位移地址可能并不常见,但我希望通过这种语法完全理解所有内存寻址形式.

assembly gnu-assembler intel-syntax

8
推荐指数
1
解决办法
3878
查看次数

二进制搜索以查找数字所在的范围

我有一个阵列

Values array: 12 20 32 40 52
              ^  ^  ^  ^  ^
              0  1  2  3  4
Run Code Online (Sandbox Code Playgroud)

我必须在其上执行二进制搜索以找到数字所在范围的索引.例如:

  1. 给定数字 - > 19(它位于索引0和1之间),返回0
  2. 给定数字 - > 22(它位于索引1和2之间),返回1
  3. 给定数字 - > 40(位于索引3和4之间),返回3

我以下面的方式实现了二进制搜索,这对于案例1和3来说是正确的但是如果我们搜索案例2或52,55 32等则不正确.

#include <iostream>
using namespace std;

int findIndex(int values[], int number, unsigned first, unsigned last)
{
    unsigned midPoint;
    while(first<last)
    {
        unsigned midPoint = (first+last)/2;
        if (number <= values[midPoint])
            last = midPoint -1;
        else if (number > values[midPoint])
            first = midPoint + 1;
    }
    return midPoint;
}


int main() …
Run Code Online (Sandbox Code Playgroud)

c++

8
推荐指数
1
解决办法
2万
查看次数

Python中set -o pipefail的等价物?

我有一些Python脚本,每个脚本都大量使用排序,统一,计数,gzipping和gunzipping,以及awking.作为我用过的代码的第一次运行subprocess.call(是的,我知道安全风险,这就是为什么我说它是第一次通过)shell=True.我有一个小帮手功能:

def do(command):
    start = datetime.now()
    return_code = call(command, shell=True)
    print 'Completed in', str(datetime.now() - start), 'ms, return code =', return_code
    if return_code != 0:
        print 'Failure: aborting with return code %d' % return_code
        sys.exit(return_code)
Run Code Online (Sandbox Code Playgroud)

脚本使用此助手,如下面的代码段所示:

do('gunzip -c %s | %s | sort -u | %s > %s' % (input, parse, flatten, output))
do("gunzip -c %s | grep 'en$' | cut -f1,2,4 -d\|| %s > %s" % (input, parse, output))
do('cat %s | %s | gzip …
Run Code Online (Sandbox Code Playgroud)

python bash shell pipe

8
推荐指数
1
解决办法
1762
查看次数

如何解释这种看似不一致的Java varargs行为呢?

如果我写Java方法

public static void f(int... x) {
    for (int a: x) {
        System.out.println(a);
    }
}
Run Code Online (Sandbox Code Playgroud)

然后我可以通过调用此方法

f(1, 2, 3);
Run Code Online (Sandbox Code Playgroud)

以及

f(new int[]{1, 2, 3});
Run Code Online (Sandbox Code Playgroud)

并且两个电话的处理方式完全相同.但是,这两个电话

Arrays.asList(1, 2, 3)              // (a) produces a three-element Integer list
Run Code Online (Sandbox Code Playgroud)

Arrays.asList(new int[]{1, 2, 3})   // (b) produces a one-element list of Integer arrays
Run Code Online (Sandbox Code Playgroud)

不一样对待. 关于在JLS中评估参数的部分说明" m的最终形式参数必然具有T[]某些类型T",那么为什么不是上面情况(b)中的"最终形式参数" 不是一个可以创建三元素的整数数组列表,如案例(a)?

我唯一能想到的是Arrays.asList通用的,关于类型兼容性的东西(在JLS第15.12.4.2节中提到)在这里起作用,但是我不能完全理解JLS中的实际句子两种情况不同.

JLS中的评论谈到了为了处理"参数化类型和Java虚拟机中发生的带有擦除泛型的数组类型"之间的相互作用,需要仔细制作这些语义,但我们最终得到的是我的功能f并且Arrays.asList似乎表现得很好不一致.在前一种情况下,我可以"解包"或"打包"我的args,一切都是一样的; 在后一种情况下,这两种情况是不同的.

这是如何用语言律师的术语解释的?

java arrays generics variadic-functions

8
推荐指数
1
解决办法
275
查看次数

如何在Swift中捕获算术溢出错误?

这个可能很容易.我们知道运算符&+对整数(环绕)进行模运算,而运算符+会导致错误.

$ swift
  1> var x: Int8 = 100
x: Int8 = 100
  2> x &+ x
$R0: Int8 = -56
  3> x + x
Execution interrupted. Enter Swift code to recover and continue.
Run Code Online (Sandbox Code Playgroud)

这有什么错误?我无法抓住它,我无法将其转为可选:

  4> do {try x + x} catch {print("got it")}
Execution interrupted. Enter Swift code to recover and continue.
  5> try? x + x
Execution interrupted. Enter Swift code to recover and continue.
Run Code Online (Sandbox Code Playgroud)

我很确定这种错误是这个StackOverflow问题(除零)的错误,但我不知道是否可以捕获这种错误.我错过了什么简单的事情?可以被困吗?如果是这样,怎么样?

error-handling integer-overflow swift

8
推荐指数
2
解决办法
1534
查看次数

如何检查数组中的所有元素是否为正整数?

我说有一个阵列

int[] array = new int[] { 1, 5, 11, 5 };
Run Code Online (Sandbox Code Playgroud)

如何检查(以最简单有效的方式)所有元素都是正面的?如果至少一个数字不是正整数,则系统将以否定方式响应.

期望的输出:

如果所有数字都是正数,那么它将显示"All Positive"否则"Wrong"

我的镜头

int[] array = new int[] { 1, 5, 11, 5 };
var x = array.All(c => c >= '0' && c <= '9');
if (x == true) "Positive" else "Wrong";
Run Code Online (Sandbox Code Playgroud)

c# linq

7
推荐指数
2
解决办法
1万
查看次数

在尝试查看符号是否为函数之前,Python是否假设符号是一种类型?

在Python中,符号int既可以用作类型,也可以用作内置函数.但是当我int在REPL中使用或询问它的类型时,REPL告诉我它是一种类型.

>>> int
<type 'int'>
>>> type(int)
<type 'type'>
Run Code Online (Sandbox Code Playgroud)

这很好,但int也是一个内置函数:它在Python文档中的内置函数表中列出.

其他内置函数在REPL中报告如下:

>>> abs
<built-in function abs>
>>> type(abs)
<type 'builtin_function_or_method'>
Run Code Online (Sandbox Code Playgroud)

但我不能type告诉我这个int.现在显然我可以使用int作为一个功能,如果我想(抱歉使用map而不是理解,我只是想说明一点):

>>> map(int, ["4", "2"])
[4, 2]
Run Code Online (Sandbox Code Playgroud)

因此Python知道使用该功能.但为什么type选择功能上的类型?函数定义中的type任何内容都没有预料到这一点.然后作为后续行动,这个表达的含义是什么:

id(int)
Run Code Online (Sandbox Code Playgroud)

这给了我id类型或功能.我期待前者.现在,如果它是前者,我将如何获得内置函数的id int

python

6
推荐指数
1
解决办法
142
查看次数

为什么`vector`和`[...]`有时在Clojure中表现不同?

在Clojure中,方括号是定义向量的简写:

user=> (vector 'a 'b 'c)
[a b c]
user=> ['a 'b 'c]
[a b c]
Run Code Online (Sandbox Code Playgroud)

该文档页面vector讲的很长的路要走,并确定载体的一小段路.

然而,在defndoseq那里似乎存在差异.

user=> (doseq [x (range 1 4)] (printf "%d\n" x)) 
1
2
3
nil
user=> (doseq (vector 'x (range 1 4)) (printf "%d\n" x)) 
IllegalArgumentException doseq requires a vector for its binding in user:1 clojure.core/doseq (core.clj:2935)
Run Code Online (Sandbox Code Playgroud)

这种差异的原因是什么?方括号在读者中是否具有特殊地位,或者它们是否具有特定的形式?

syntax vector clojure syntactic-sugar

6
推荐指数
1
解决办法
153
查看次数

Clojure中的Heap算法(可以有效实现吗?)

Heap的算法枚举了数组的排列.维基百科关于算法的文章说,罗伯特塞奇威克总结说,算法"当时是计算机生成排列的最有效算法",所以自然会尝试实现它.

该算法是关于在可变数组中进行一系列交换的,所以我在Clojure中实现这个,它的序列是不可变的.我把以下内容放在一起,完全避免了可变性:

(defn swap [a i j]
  (assoc a j (a i) i (a j)))

(defn generate-permutations [v n]
  (if (zero? n)
    ();(println (apply str a));Comment out to time just the code, not the print
    (loop [i 0 a v]
      (if (<= i n)
        (do
          (generate-permutations a (dec n))
          (recur (inc i) (swap a (if (even? n) i 0) n)))))))

(if (not= (count *command-line-args*) 1)
  (do (println "Exactly one argument is required") (System/exit 1))
  (let [word (-> *command-line-args* …
Run Code Online (Sandbox Code Playgroud)

arrays recursion performance clojure

6
推荐指数
1
解决办法
203
查看次数

Julia中的宏调用与宏定义环境

我试图通过Julia关于宏观卫生的Metaprogramming文档中的陈述来理解.文件声称

Julia的宏扩展器以下列方式解决了这些问题.首先,宏结果中的变量被分类为本地或全局变量.如果将变量分配给(并且未声明为全局变量),声明为本地变量或将其用作函数参数名称,则该变量被视为本地变量.否则,它被认为是全球性的.然后将局部变量重命名为唯一(使用生成新符号的gensym()函数),并在宏定义环境中解析全局变量.因此,处理上述两个问题; 宏的locals不会与任何用户变量冲突,time和println将引用标准库定义.

我编写了一个小程序来查看全局变量是否确实在宏定义环境中得到了解决.我写了以下内容:

f(x) = x + 100 

macro g()         # According to Julia docs, ...
  :(f(x) + 5)     # ... f is global, x is local, right?
end               # if so, f should refer to the f above?

(function main()
  local x = 3
  f(x) = x - 100  # f in the call environment subtracts 100
  println(@g())   # So why does this do -92?
end)()
Run Code Online (Sandbox Code Playgroud)

如果我要正确理解Julia文档,宏观卫生的一部分是确保在宏的返回表达式中调用的任何函数都不会被调用者环境中的同名函数劫持.但这正是这里发生的事情,使用的函数f是在本地定义的函数.

我原本以为我必须使用esc才能f在通话点使用范围.但事实并非如此,为什么呢?

另外,我注意到x …

macros hygiene julia

6
推荐指数
1
解决办法
482
查看次数