如果用户类型time_t定义为__darwin_time_t,其本身long在MacOS X中定义,为什么以下代码输出8 Time is (null)?也许这是愚蠢的事,但我无法理解它.
#include <stdio.h>
#include <time.h>
int main(void)
{
time_t time = 0x7FFFFFFFFFFFFFFF;
printf("%lu\n"
"Time is %s\n", sizeof(time_t), ctime(&time));
return 0;
}
Run Code Online (Sandbox Code Playgroud) 我一直在为Windows做一些黑客攻击,当我做SIDT时遇到了一个事实.当我读SIDT时,我发现IDT限制的值是0xFFF(u4096).
我很惊讶地发现它.我的印象是最大描述符数是256.那么IDTR限制为何是0xFFF?
我的系统是I7在64位运行Win 7.
谢谢.
我有一个带有xchg指令的自旋锁.C++函数接受要锁定的资源.
以下是代码
void SpinLock::lock( u32& resource )
{
__asm__ __volatile__
(
"mov ebx, %0\n\t"
"InUseLoop:\n\t"
"mov eax, 0x01\n\t" /* 1=In Use*/
"xchg eax, [ebx]\n\t"
"cmp eax, 0x01\n\t"
"je InUseLoop\n\t"
:"=r"(resource)
:"r"(resource)
:"eax","ebx"
);
}
void SpinLock::unlock(u32& resource )
{
__asm__ __volatile__
(
/* "mov DWORD PTR ds:[%0],0x00\n\t" */
"mov ebx, %0\n\t"
"mov DWORD PTR [ebx], 0x00\n\t"
:"=r"(resource)
:"r"(resource)
: "ebx"
);
}
Run Code Online (Sandbox Code Playgroud)
此代码在64位intel机器上使用 gcc 4.5.2 编译 -masm=intel.
在 objdump 用于上述功能产生以下组件.
0000000000490968 <_ZN8SpinLock4lockERj>:
490968: 55 push %rbp
490969: 48 89 …Run Code Online (Sandbox Code Playgroud) 是否可以在"64位处理器"上运行"32位操作系统"?
当我将.net中的运行时间定位到x-64并且我的操作系统是32位时会发生什么?
还有一个补充"顺便说一下32位操作系统(对比32位处理器)的含义"?
根据wiki x86-64支持16位,32位和64位程序.在运行代码的意义上,它是否比其他更好地支持一个?有人(可能是我的屁股冒烟)告诉我Operteron CPU是第一个运行64位但仍然是32位原生的CPU.
在这种背景下成为"本土"意味着什么?我在维基百科上注意到它说64位是x86的扩展,那么它有什么影响呢?
众所周知,%rsp指向堆栈框架的顶部,%rbp指向堆栈框架的底部。然后我不明白为什么这段代码中%rbp是0x0:
(gdb) x/4xg $rsp
0x7fffffffe170: 0x00000000004000dc 0x0000000000000010
0x7fffffffe180: 0x0000000000000001 0x00007fffffffe487
(gdb) disas HelloWorldProc
Dump of assembler code for function HelloWorldProc:
=> 0x00000000004000b0 <+0>: push %rbp
0x00000000004000b1 <+1>: mov %rsp,%rbp
0x00000000004000b4 <+4>: mov $0x1,%eax
0x00000000004000b9 <+9>: mov $0x1,%edi
0x00000000004000be <+14>: movabs $0x6000ec,%rsi
0x00000000004000c8 <+24>: mov $0xd,%edx
0x00000000004000cd <+29>: syscall
0x00000000004000cf <+31>: leaveq
0x00000000004000d0 <+32>: retq
End of assembler dump.
(gdb) x/xg $rbp
0x0: Cannot access memory at address 0x0
Run Code Online (Sandbox Code Playgroud)
如果它什么都不指向,为什么为什么要“保存”(推入)%rbp?
幸运的是,学习计算机编程艺术的所有用途都可以访问Stack Overflow等社区!我决定承担学习如何编程计算机的任务,我正在通过一本名为"从头开始编程"的电子书的知识这样做,该电子书教会读者如何用汇编语言创建程序在GNU/Linux环境中.
我在本书中的进展已经到了创建一个程序,该程序用函数计算整数4的阶乘,我已经完成并完成了没有由GCC的汇编程序引起的或由运行程序引起的任何错误.但是,我的程序中的功能没有返回正确的答案!阶乘4是24,但程序返回值0!说对了,我不知道为什么会这样!
以下是供您考虑的代码:
.section .data
.section .text
.globl _start
.globl factorial
_start:
push $4 #this is the function argument
call factorial #the function is called
add $4, %rsp #the stack is restored to its original
#state before the function was called
mov %rax, %rbx #this instruction will move the result
#computed by the function into the rbx
#register and will serve as the return
#value
mov $1, %rax #1 must be placed inside this register for
#the exit system …Run Code Online (Sandbox Code Playgroud) 通过查看内核源代码中的binfmt_elf.c,我无法弄清楚在生成32位进程与64位进程时内核(64位)的作用有何不同.
任何人都可以向我解释我错过了什么吗?
(这个问题与我关于在64位指令(链接)的同一过程中有32位指令的其他问题有关,但这可以作为一个单独的问题.)
我想尽可能地优化我的函数,我做的一件事就是使用r8作为指针,因为这是指针在x64函数中被推入的寄存器.
但是推送RSI或RDI,将指针移动到它们并在循环中更快地使用它们?
例如,mov [RSI],DL;将编译为2个字节和:mov [r8],DL; 将编译为3个字节
所以,如果我做了100到200次循环,r8会因为要解码的额外字节而变慢吗?或推动RSI并移动指针消除任何可能的速度增加?显然push和mov会在循环外发生.
为什么32位C将所有函数参数直接推送到堆栈上,而64位C将前6个参数放入寄存器而其余的放在堆栈中?
所以32位堆栈看起来像:
...
arg2
arg1
return address
old %rbp
Run Code Online (Sandbox Code Playgroud)
虽然64位堆栈看起来像:
...
arg8
arg7
return address
old %rbp
arg6
arg5
arg4
arg3
arg2
arg1
Run Code Online (Sandbox Code Playgroud)
那么为什么64位C会这样做呢?将所有内容都推送到堆栈而不是将前6个参数放在寄存器中以便将它们移动到函数序言中的堆栈中是不是更容易?