小编Den*_*nis的帖子

为什么rbp和rsp称为通用寄存器?

根据英特尔在x64中,以下寄存器称为通用寄存器(RAX,RBX,RCX,RDX,RBP,RSI,RDI,RSP和R8-R15)https://software.intel.com/en-us/articles/介绍到x64组装.

在下面的文章中,写了RBP和RSP是专用寄存器(RBP指向当前堆栈帧的基础,RSP指向当前堆栈帧的顶部). https://www.recurse.com/blog/7-understanding-c-by-learning-assembly

现在我有两个相互矛盾的陈述.英特尔声明应该是值得信赖的,但是什么是正确的,为什么RBP和RSP被称为通用目的?

谢谢你的帮助.

assembly x86-64 cpu-registers

20
推荐指数
2
解决办法
2万
查看次数

Keras:ValueError:没有为"input_1"提供数据.需要每个密钥的数据

我正在使用keras功能API和维度(224,224,3)的输入图像.我使用功能API有以下模型,尽管顺序模型似乎也出现了类似的问题:

input = Input(shape=(224, 224, 3,))
shared_layers = Dense(16)(input)
model = KerasModel(input=input, output=shared_layers)
model.compile(loss='binary_crossentropy', optimizer='sgd', metrics='accuracy'])
Run Code Online (Sandbox Code Playgroud)

我打电话给model.fit_generator我的发电机

yield ({'input_1': image}, {'output': classification}) 
Run Code Online (Sandbox Code Playgroud)

image是输入(224,224,3)图像并且classification在{-1,1}中.

在拟合模型时,我得到一个错误

ValueError: No data provided for "dense_1". Need data for each key in: ['dense_1']
Run Code Online (Sandbox Code Playgroud)

一个奇怪的事情是,如果我input_1将dict 的目标切换到dense_1,则错误切换为缺少输入input_1,但dense_1如果两个键都在数据生成器中,则返回丢失.

无论我是fit_generator从发电机呼叫还是从批次中获取电话,都会发生这种情况train_on_batch.

有谁知道发生了什么?据我所知,这应该与文档中给出的相同,尽管输入大小不同.

Full traceback:
Traceback (most recent call last):
  File "pymask.py", line 303, in <module>
    main(sys.argv)
  File "pymask.py", line 285, in main …
Run Code Online (Sandbox Code Playgroud)

machine-learning neural-network keras

9
推荐指数
3
解决办法
5539
查看次数

如何设置 gcc 以永久使用 intel 语法?

我有以下代码,可以用 gcc 命令很好地编译gcc ./example.c。程序本身调用函数“add_two”,它只是将两个整数相加。要在扩展汇编指令中使用 intel 语法,我需要首先切换到 intel,然后再切换回 AT&T。根据 gcc 文档,可以使用gcc -masm=intel ./exmaple.

每当我尝试使用 switch 编译它时,-masm=intel它都不会编译,我不明白为什么?我已经尝试删除该指令,.intel_syntax但它仍然无法编译。

#include <stdio.h>

int add_two(int, int);

int main(){
     int src = 3;
     int dst = 5;
     printf("summe = %d \n", add_two(src, dst));
     return 0;
}

int add_two(int src, int dst){

    int sum;

    asm (
        ".intel_syntax;"  //switch to intel syntax
        "mov %0, %1;"
        "add %0, %2;"

        ".att_syntax;"  //switch to at&t syntax
        : "=r" (sum) //output
        : "r" (src), "r" …
Run Code Online (Sandbox Code Playgroud)

x86 assembly gcc inline-assembly intel-syntax

5
推荐指数
1
解决办法
4480
查看次数

Ubuntu 16.04 - malloc实现.指向下一个块的指针在哪里?

我试图了解glibc中的malloc实现是如何工作的.根据malloc的源代码(glibc 2.23中的malloc.c),空闲内存块具有以下结构.

    chunk-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
            |             Size of previous chunk                            |
            +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    `head:' |             Size of chunk, in bytes                         |P|
      mem-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
            |             Forward pointer to next chunk in list             |
            +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
            |                 Back pointer to previous chunk in list        |
            +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
            |             Unused space (may be 0 bytes long)                .
            .                                                               .
            .                                                               |
nextchunk-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    `foot:' |             Size of chunk, in bytes                           |
            +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
Run Code Online (Sandbox Code Playgroud)

通常我们应该能够在gnu调试器(gdb)中看到这个结构.所以我写了以下程序.该程序分配6个大小为64字节的内存块.每个块都填充了memset,因此我们可以在以后轻松查看gdb中的相应块.因为块1,3和6被释放,所以它们应该具有上述结构.由于中间存在已分配的块,因此释放的块不能合并,因此它们通过每个块中的指针组织在双重链表中.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

void to_jump();

int main(int argc, char **argv){
    char …
Run Code Online (Sandbox Code Playgroud)

c linux heap malloc memory-management

5
推荐指数
1
解决办法
351
查看次数

使用r8寄存器作为循环计数器会导致无限循环 - 为什么?

以下代码使用rsi寄存器作为循环计数器打印hello world 10次.

section .data
    hello:     db 'Hello world!',10   
    helloLen:  equ $-hello             

section .text
    global _start

_start:
    mov rsi, 0                 ;<--- use r8 here

do_loop:
    inc rsi                    ;<--- use r8 here

    ;print hello world
    mov eax,4             
    mov ebx,1            
    mov ecx,hello       
    mov edx,helloLen     

    int 80h              

    cmp rsi, 10                ;<--- use r8 here
    jnz do_loop

    ;system exit
    mov eax,1            ; The system call for exit (sys_exit)
    mov ebx,0            ; Exit with return code of 0 (no error)
    int 80h;
Run Code Online (Sandbox Code Playgroud)

如果我试图使用r8寄存器而不是rsi作为循环计数器,则会导致无限循环.这里的r8寄存器只是一个例子.它也适用于寄存器r9,r10.

有人可以解释一下,因为我认为这些都是通用寄存器,你应该被允许使用它们吗?

linux assembly x86-64 nasm system-calls

2
推荐指数
1
解决办法
185
查看次数