小编ziy*_*uxe的帖子

NASM 我应该在调用函数后弹出函数参数吗?

假设我有一个像这样的 nasm 函数:

inc:
    mov rax,[rsp + 8]
    add [rax],BYTE 1
    ret
Run Code Online (Sandbox Code Playgroud)

我这样调用这个函数:

push some_var
call inc
Run Code Online (Sandbox Code Playgroud)

我想通过堆栈将参数传递给函数,因此我压入some_var然后调用我的函数。在函数中,我的项目位于堆栈中的第二个,因此我将其视为:mov rax,[rsp+8]

我的问题是:调用函数后我应该以某种方式从堆栈中弹出我的参数吗?如果是这样,我可以以某种方式从堆栈中删除它,我的意思是弹出它,但不注册?(因为我不再需要这个论点了。)

更新:我发现我可以简单地add rsp,8从堆栈中删除项目。但这是好的做法吗?调用函数后从堆栈中删除参数?

assembly callstack x86-64 nasm calling-convention

4
推荐指数
1
解决办法
1212
查看次数

Haskell 左箭头运算符替代

我一般是 Haskell 和函数式编程的新手,而且我对 monad 有问题。假设我有一个文件名列表:

-- do block --
let filenames = ["file1","file2"]
Run Code Online (Sandbox Code Playgroud)

我想使用列表推导生成这些文件内容的列表:

let content = [str <- readFile f | f <- filenames]
Run Code Online (Sandbox Code Playgroud)

Ofc,这种用法是无效的。据我了解,这种“赋值”可以在 do 块中使用,当“链接”结果与下一条指令时。

是否有使用左箭头(或 >>=)运算符的替代方法。我想像这样:

let content = [leftArrAlter $ readFile f | f <- filenames]
Run Code Online (Sandbox Code Playgroud)

monads haskell

3
推荐指数
1
解决办法
61
查看次数

Java wait() 和 notifyAll() 恢复最旧的线程

我的问题:

假设我有A一些变量的类a

B带有变量的类prevnext

在课堂上,A我想制作changeIfEqual(B myB)检查是否的方法,如果是A.a == my_B.prev,我将更A.a改为my_B.next. 但是,如果A.a != my_B.prev我希望线程wait()直到 continion 为真,然后执行等待时间最长的线程。

所以我想A.changeIfEqual(B myB)应该是这样的:

public synchronized void changeIfEqual(B myB){
  while(this.a != myB.b_prev){
     wait();
  }
  notifyAll();
}
Run Code Online (Sandbox Code Playgroud)

在这种情况下,问题是如何确保恢复最旧的线程?(wait()并且notifyAll()不提供)

java concurrency thread-safety

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