我想要做的是使用 Emu8086 启动我的程序来调试我的汇编代码,就好像它是通过带有一些参数的命令行启动的一样。使用 DOSBox,我像这样启动我的程序:program.exe result.txt source.txt(result.txt 和 source.txt 是参数),但它没有按预期方式工作,我需要找出原因。如何“模仿”命令行参数传递到 Emu8086 中?
假设我有一个名为 func 的函数:
PROC func:
;Bla bla
ret
ENDP func
Run Code Online (Sandbox Code Playgroud)
现在,假设我使用 register ax,bx例如,为了保存它们的初始值,我将它们推送到函数内部的堆栈中。
现在的问题是:在创建堆栈帧之前推送寄存器之间是否有很大的不同:
PROC func:
push bp
push ax
push bx
mov bp, sp
;Bla bla
ret
ENDP func
Run Code Online (Sandbox Code Playgroud)
还是之后?
PROC func:
push bp
mov bp, sp
push ax
push bx
;Bla bla
ret
ENDP func
Run Code Online (Sandbox Code Playgroud)
我应该在我的程序中使用什么?一种方法比另一种更好或更“正确”吗?因为我目前使用第一种方法。
在我对问题汇编代码返回数组中最小整数而不是随机返回最后一个或倒数第二个数字的问题中,我提出了使用指令的替代方案cmovcc。我在那里指出:
该
cmov指令似乎所有 AMD64 CPU 都支持。
然而,当时我还没有找到确凿的消息来源来支持这一说法。所以我想发布这个问题来询问这个问题。
在GDT 上的文章中, OSDev wiki 描述了用作 CS 描述符的 D 位的标志如下:
Sz:大小位。如果为0,则选择器定义 16 位保护模式。如果为1,则定义 32 位保护模式。您可以同时拥有 16 位和 32 位选择器。
另一个问题引用了 Intel 手册:代码段描述符中的 D 标志对 x86-64 指令有什么作用?它链接到Intel 64 和 IA-32 架构软件开发人员手册第 3 卷 [...]:系统编程指南中的“3.4.5 段描述符”部分 ,阅读:
D/B(默认操作大小/默认堆栈指针大小和/或上限)标志
根据段描述符是可执行代码段、向下扩展数据段还是堆栈段执行不同的功能。(对于 32 位代码和数据段,此标志应始终设置为 1,对于 16 位代码和数据段,应始终设置为 0。)
• 可执行代码段。该标志称为 D 标志,它表示段中指令引用的有效地址和操作数的默认长度。如果设置了标志,则假定为 32 位地址和 32 位或 8 位操作数;如果清楚,则假定为 16 位地址和 16 位或 8 位操作数。指令前缀 66H 可用于选择默认值以外的操作数大小,前缀 67H 可用于选择默认值以外的地址大小。
问题是,“D”代表什么?
在我看来,%define定义单行宏的指令只是%assign具有附加功能(例如获取参数的能力)的指令。如果是这样的话,使用还有什么意义呢%assign?另外,关于%xdefine和equ呢?
这里的答案对我来说并不清楚,因为它太短了。我也阅读了文档,但我没有看到使用%assign.
在8086中,此结构是正确的:
mov bh,[bx]
Run Code Online (Sandbox Code Playgroud)
但这是不正确的:
mov bh,[cx]
Run Code Online (Sandbox Code Playgroud)
我不知道为什么 我认为通用寄存器(AX,BX,CX,DX,SP,BP,SI和DI)是可以用于任何目的的寄存器,并且BX用于基地址或CX用于计数器的声明只是一个约定,它们完全没有区别。但是看来我错了。你能解释原因吗?这些寄存器之间的确切区别是什么?(例如,为什么不能将基址保存在cx寄存器中?)
如何修复函数错误?
已弃用:必需参数 $orderfield 位于 C:\xampp\htdocs\shop\includes\functions\functions.php 第 8 行中的可选参数 $where 之后
function getAllFrom($field, $table, $where = NULL, $and = NULL, $orderfield, $ordering = "DESC") {
global $con;
$getAll = $con->prepare("SELECT $field FROM $table $where $and ORDER BY $orderfield $ordering");
$getAll->execute();
$all = $getAll->fetchAll();
return $all;
}
Run Code Online (Sandbox Code Playgroud)
<?php
$allItems = getAllFrom('*', 'items', 'where Approve = 1', '', 'Item_ID');
foreach ($allItems as $item) {
echo '<div class="col-sm-6 col-md-3">';
echo '<div class="thumbnail item-box">';
echo '<span class="price-tag">$' . $item['Price'] . '</span>';
echo '<img class="img-responsive" src="img.png" …Run Code Online (Sandbox Code Playgroud) 我们都知道 NodeJS 是单线程的,这意味着如果我们的代码中有 async/await 操作,节点将等待它完成后再执行其余代码。因此,如果用户发出异步请求,其他用户也应该等待它完成后再发出请求吗?
这里我创建了一个简单的示例,第一个路由使用异步函数,需要 10 秒才能发送响应,第二个路由立即发送响应。
当我向第一个路由发送请求并在等待响应时,我向第二个路由发送了另一个请求,并且即使第一个路由尚未完成执行代码,我也得到了响应。
为什么这个例子是非阻塞的?
function sleep(){
return new Promise((resolve,reject)=>{
setTimeout(()=>{
resolve(true)
},10000)
}).then(val=>val)
}
router.get('/route1',async (req,res)=>{
const test = await sleep()
res.send('HELLO WORLD')
})
router.get('/route2',(req,res)=>{
res.send("HELLO WORLD")
})
Run Code Online (Sandbox Code Playgroud) assembly ×6
x86 ×2
async-await ×1
callstack ×1
dosbox ×1
emu8086 ×1
express ×1
gdt ×1
javascript ×1
macros ×1
nasm ×1
node.js ×1
nonblocking ×1
pdo ×1
php ×1
preprocessor ×1
stack-frame ×1
terminology ×1
x86-16 ×1
x86-64 ×1