假设我有一个像这样的 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从堆栈中删除项目。但这是好的做法吗?调用函数后从堆栈中删除参数?
我一般是 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) 我的问题:
假设我有A一些变量的类a
和B带有变量的类prev和next
在课堂上,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()不提供)