我有兴趣了解C++在基于Intel的系统上使用的单一或双重类型的二进制格式.
在数据需要由另一个系统(即文件或网络)读取或写入的情况下,我避免使用浮点数.我确实意识到我可以使用定点数,而且这个定点更准确,但我有兴趣了解浮点格式.
我有一个英特尔汇编x86(16位版本)汇编代码如下所示打印邮件很好.使用扁平汇编程序在Win-7 32位上进行汇编.
ORG 100h
USE16
mov ah, 09
mov dx, message
jmp Displayit ;unconditional jump
mov ah,01
int 21h
mov ah,4ch
int 21h
Displayit:
int 21h
message db 'Testing assembly jump instruction', 0Ah, '$'
Run Code Online (Sandbox Code Playgroud)
如果我移动消息的字符串定义(在下面的代码中),在开头,它不会打印该字符串?是什么原因?
此外,虽然我有mov ah, 01, int 21h
保持输出命令提示符/控制台关闭的指令,但它不起作用.控制台刚关闭,然后才能看到打印的消息?
.
ORG 100h
USE16
message db 'Testing assembly jump instruction', 0Ah, '$'
mov ah, 09
mov dx, message
jmp Displayit ;unconditional jump
mov ah,01
int 21h
mov ah,4ch
int 21h
Displayit:
int 21h
Run Code Online (Sandbox Code Playgroud) 在下面的intel汇编代码中,我在条件跳转之前使用cmp(compare)指令,但对于下面的代码,它不应该跳转但是它会打印字符串.
出了什么问题.(Flat assembler,Win-7 x32).
ORG 100h
USE16
mov ah, 09
mov dx, message
cmp ah, 10d
je condjmp
condjmp:
int 21h
mov ah,01
int 21h
mov ah,4ch
int 21h
message db 'conditional jump', 0Ah, '$'
Run Code Online (Sandbox Code Playgroud) 在我的IA-32处理器Linux程序集中,我有两个存储空间.
inbuf: resb 3
outbuf: resb 4
Run Code Online (Sandbox Code Playgroud)
inbuf
真的只需要3个字节,我不想浪费任何内存.现在,假设我想用这样的零覆盖它们:
xor [inbuf], inbuf
xor [outbuf], outbuf
Run Code Online (Sandbox Code Playgroud)
nasm说我需要指定操作大小,这是可以理解的.现在outbuf
这个没问题,因为我可以写
xor dword [outbuf], outbuf
Run Code Online (Sandbox Code Playgroud)
相反,但显然,任意大小的大小关键字都不是3字节.我该如何指定大小inbuf
?
我不是真的在寻找一个用零覆盖存储的解决方案,我猜其他的工作也一样,但这也解决了我的问题如何使用像
mov eax, inbuf
Run Code Online (Sandbox Code Playgroud)
没有得到"未指定大小"错误.
英特尔x86规范规定,使用同一组中的多个指令前缀会导致未定义的行为.实际上,Pentium III Coppermine CPU在这种情况下是如何做出反应的?可悲的是,我没有芯片可以测试.
是否可以在老一代英特尔处理器上进行英特尔SGX开发,该处理器在某些仿真环境中没有SGX支持?
我尝试安装正确安装但无法安装SGX PSW的SGX SDK,因为支持英特尔SGX处理器是一项艰难的要求.
https://software.intel.com/en-us/documentation/sgx-sdk-installation/platform-software-installation
我想开发和学习简单的SGX应用程序.
以下是做什么的?
testq %rdx, %rdx
cmovg %rcx, %rax
Run Code Online (Sandbox Code Playgroud)
我知道testq是两个寄存器之间的按位,但它如何与标志一起工作?这将在c中转化为什么?例如,如果%rdx
将持有价值0x01
,那么我们就会有0x01
&0x01
= 0x01
,这将设置
ZF = 0, SF = 0, OF = 0.
Run Code Online (Sandbox Code Playgroud)
而且,如果我能找到cmovg
˜(SF ˆ OF) & ˜ZF
Run Code Online (Sandbox Code Playgroud)
哪个会解决
˜(0 ˆ 0) & ˜0 = ˜(0) & ˜0 = 1 & 1 = 1.
Run Code Online (Sandbox Code Playgroud)
这是否意味着将执行cmovg并且相应的c代码将表现为d = %rdx
,a = rax
并且c = rcx
:
if(d > 0){
a = c;
}
Run Code Online (Sandbox Code Playgroud)
或者有人可以换句话说这个吗?
另外,我一直在尝试使用这个程序集将其转换为相应的c代码.目前我得到的结果最终像testq%rdx上的无限while循环,%rdx与jne .L4.随着上面的内容被封闭.谁知道正确的解决方案是什么?我目前的解决方案是:
p:
movq (%rdi), %rdx
testq %rdx, %rdx
je …
Run Code Online (Sandbox Code Playgroud) 我在装配中经历了这个链接延迟,以增加装配延迟.我想通过添加不同的延迟值来执行一些实验.
生成延迟的有用代码
; start delay
mov bp, 43690
mov si, 43690
delay2:
dec bp
nop
jnz delay2
dec si
cmp si,0
jnz delay2
; end delay
Run Code Online (Sandbox Code Playgroud)
我从代码中理解的是,延迟与执行nop指令所花费的时间成比例(43690x43690).所以在不同系统和不同版本的操作系统中,延迟会有所不同.我对吗?
任何人都可以向我解释如何计算nsec的延迟量,下面的汇编代码正在生成,以便我可以结束我在实验设置中添加的延迟的实验?
这是我用来生成延迟而不理解使用43690值的逻辑的代码(我在原始源代码中只对一个循环使用了一个循环).为了产生不同的延迟(不知道它的值),我只改变了数字43690到403690或其他值.
32位操作系统中的代码
movl $43690, %esi ; ---> if I vary this 4003690 then delay value ??
.delay2:
dec %esi
nop
jnz .delay2
Run Code Online (Sandbox Code Playgroud)
这个汇编代码会产生多少延迟?
如果我想在microsec中生成100nsec或1000nsec或任何其他延迟,那么我需要在寄存器中加载什么初始值?
我使用的是ubuntu 16.04(32位和64位),Intel(R)Core(TM)i5-7200U CPU @ 2.50GHz和Core-i3 CPU 3470 @ 3.20GHz处理器.
先感谢您.
前一段时间,我问了一个关于堆栈溢出的问题,并展示了如何在C++中执行rdtsc操作码.我最近使用rdtsc创建了一个基准函数,如下所示:
inline unsigned long long rdtsc() {
unsigned int lo, hi;
asm volatile (
"cpuid \n"
"rdtsc"
: "=a"(lo), "=d"(hi) /* outputs */
: "a"(0) /* inputs */
: "%ebx", "%ecx"); /* clobbers*/
return ((unsigned long long)lo) | (((unsigned long long)hi) << 32);
}
typedef uint64_t (*FuncOneInt)(uint32_t n);
/**
time a function that takes an integer parameter and returns a 64 bit number
Since this is capable of timing in clock cycles, we won't have to do it a
huge …
Run Code Online (Sandbox Code Playgroud) 我在x86-64汇编中开发了一个程序,该程序需要通过相同的操作进行多次迭代:
IMUL rdx, 3 # rdx is always different
Run Code Online (Sandbox Code Playgroud)
但是,我需要使运行时更快,因此我从上面想到了对该特定行的优化:
MOV rcx, rdx
SHL rdx, 1
ADD rdx, rcx
Run Code Online (Sandbox Code Playgroud)
现在我问你们:这种修改会改善程序的运行时间(减少时钟),还是我应该坚持使用该IMUL
命令?