这是昨天我的问题的后续行动:
CMS慷慨地提供了使用按位运算符在C中添加两个数字的示例:
#include<stdio.h>
int add(int x, int y) {
int a, b;
do {
a = x & y;
b = x ^ y;
x = a << 1;
y = b;
} while (a);
return b;
}
int main( void ){
printf( "6 + 3 = %d", add(6,3));
printf( "6 - 3 = %d", add(6,-3));
return 0;
}
Run Code Online (Sandbox Code Playgroud)
它工作得很好,然后我将它移植到Python,如下所示:
def add(x, y):
while True:
a = x & y
b = x ^ y
x = a …Run Code Online (Sandbox Code Playgroud) 在不同的汇编语言中,MUL(x86)/ MULT(mips)指的是乘法.这是程序员的黑盒子.我感兴趣的是,无论架构如何,CPU实际上如何实现乘法.假设我的寄存器中有两个16位值,而且我是cpu,所以我必须使用其他的bit-fiddling指令实现MUL(和,或者,xor,not,shl,shr等).我该怎么办?
我有一个在低延迟环境中运行的(java)应用程序,它通常处理大约600微米(+/- 100)的指令.当然,随着我们进一步进入微秒空间,您看到的成本延迟会发生变化,现在我们已经注意到2/3的时间用于分配2个核心域对象.
基准测试已将代码的违规部分与现有引用中的对象构造完全隔离,即基本上是一组引用(每个类中约15个)和一些新的列表,但请参阅下面关于确切测量的内容的注释这里.
每个人一直需要~100微米,这对我来说是莫名其妙的,我试图找出原因.一个快速的基准测试表明,一个类似大小的对象充满了字符串需要大约2-3微米到新的,显然这种基准充满了困难,但认为它可能是有用的基线.
这里有2个Q.
请注意,所涉及的硬件是Sun X4600上的Solaris 10 x86,带有8*双核opteron @ 3.2GHz
我们看过的东西包括
任何和所有的想法赞赏
从历史上看,为什么它似乎只是关于每个人和他们的孩子兄弟定义他们自己的呼叫惯例?你有C,C++,Windows,Pascal,Fortran,Fastcall以及其他可能没有提及的其他人.对于绝大多数用例,一项公约不应该是最有效的吗?是否有任何理由更喜欢一个而不是另一个?
我读到了检测堆栈增长检测问题的不同响应,我理解,在现代架构中,堆栈可能会随机增长,可能会在堆外创建,依此类推.
但是,在这个经典的访谈问题中,我想了解为什么人们使用函数调用而不是在同一函数中比较2个局部变量.我认为必须有一些特殊的理由这样做,但不是一个C /低级开发人员[Java :)],我只是在猜测.
这是我试过的代码:
void sub (int *a) {
int b;
int c;
printf ("a:%d\n", a);
printf ("b:%d\n", &b);
printf ("c:%d\n", &c);
if (&b > a) {
printf ("Stack grows up.\n");
} else {
printf ("Stack grows down.\n");
}
}
int main (void) {
int a;
int b;
sub (&a);
printf ("\nHere we go again!!\n");
if (&b > &a) {
printf ("Stack grows up.\n");
} else {
printf ("Stack grows down.\n");
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我还发现这篇文章试图优化我不理解的解决方案:http …
我最近参加了数字逻辑课程并学习了所有关于AND,OR和其他各种逻辑的知识.我们没有涉及的一件事,对编程来说是完全必要的,是if陈述,让我对他们的工作方式感到好奇.
我最好的猜测是它只是一个2:1的多路复用器,当你添加更多else语句时,它会变成4:1和8:1,但对于这样一个简单的概念来说,这似乎有点过于复杂.
任何人都知道一个if声明实际上转化为什么?
我知道屏幕阅读器和类似的软件可以帮助盲人和视障人士在Windows或其他操作系统中使用计算机.
我很好奇在较低级别的环境中可以获得哪些支持,例如OS安装程序和BIOS设置等.
我最近开始进入低级别的东西,并研究引导加载程序和操作系统等...
据我了解,至少对于ARM处理器,外围设备由引导加载程序初始化,然后映射到物理内存空间.从这里开始,代码只需将值写入映射到外设寄存器的存储空间即可访问外设.稍后,如果芯片具有MMU,则可以将其用于进一步重新映射到虚拟存储器空间.我对吗?
我不明白的是(假设我上面说的是正确的):
我刚刚在 python 中实现了一个 Linux 命令外壳,仅使用os库的低级系统调用,诸如此类fork()。
我想知道如何实现一个键侦听器,该侦听器将侦听键 (UP|DOWN) 以滚动浏览我的 shell 的历史记录。
我想在不使用任何花哨的库的情况下做到这一点,但我也希望这不是超级复杂的事情。到目前为止,我的代码只有大约 100 行代码,我不想为了获得一个简单的功能而创建一个怪物:D
我对这个问题的想法是,应该可以创建一个带有某种循环的子进程,它将侦听 up^[[A和 down ^[[B,按键,然后以某种方式将文本放入我的输入字段,就像一个普通终端。
到目前为止,我最感兴趣的是 key-listener 的可能性。但接下来我可能必须弄清楚如何将该文本输入到输入字段中。关于这一点,我想我可能必须使用提供的一些stdin功能sys。
我只对让它在 Linux 上运行感兴趣,并希望继续使用低级系统调用,最好不是为我处理所有事情的 Python 库。这是一个学习练习。
我正在为 Linux 开发一个静态独立的 nolibc/nostdlib 程序,并希望使用 C 编译器的内存、地址和未定义行为清理程序来改进我的代码。
当我尝试时,我无法让它工作:
clang -static -ffreestanding -nostdlib -fno-omit-frame-pointer -fsanitize=undefined -g -o program program.c
Run Code Online (Sandbox Code Playgroud)
这会导致编译器发出调用诸如__ubsan_handle_type_mismatch_v1@plt. 它编译和链接成功,但程序在运行时在这些引用附近出现段错误。更具体地说,在我的内存分配器中:
Program received signal SIGSEGV, Segmentation fault.
0x0000000000000000 in ?? ()
(gdb) up
(gdb) disas
Dump of assembler code for function lone_reallocate:
...
0x00000000002116d0 <+160>: bl 0x206470 <__ubsan_handle_pointer_overflow@plt>
=> 0x00000000002116d4 <+164>: b 0x2116d8 <lone_reallocate+168>
0x00000000002116d8 <+168>: ldur x8, [x29, #-72]
...
Run Code Online (Sandbox Code Playgroud)
我认为这些函数由于缺乏 libc 支持而丢失。当我尝试使用该-static-libsan选项时,出现许多未定义的符号错误:
error: undefined symbol: __aarch64_cas8_acq_rel
error: undefined symbol: pthread_self
error: undefined symbol: dl_iterate_phdr
error: …Run Code Online (Sandbox Code Playgroud)