根据英特尔在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被称为通用目的?
谢谢你的帮助.
我正在使用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) 我有以下代码,可以用 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) 我试图了解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) 以下代码使用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.
有人可以解释一下,因为我认为这些都是通用寄存器,你应该被允许使用它们吗?