我希望John McCarthy还活着,但......
LISP可以解释和执行以S表达式形式编写的程序.因此,与机器语言一样,并且与大多数其他更高级语言不同,它可以用于生成用于进一步执行的程序.
我需要更多关于机器语言如何用于生成程序以及Lisp如何实现它的澄清?
lisp machine-language s-expression computer-science-theory racket
我已经编程好几年了,但有一件事我从来没有完全理解:
有两种类型的编程语言。编译型和解释型,而编译型首先需要编译成解释型语言才能执行。
例如,C/C++ 需要先编译成机器语言,然后才能执行。
我的问题来了:谁真正运行已编译的 C/C++ Windows/Linux 程序?它是由CPU直接解释,还是OS内核执行它并将命令传递给CPU?
如果 CPU 直接执行它,Windows Kernel 怎么会拒绝一些调用呢?否则,是否意味着内核也理解机器语言,或者非内核 C/C++ 程序不能编译为机器语言?
这都是相关的,我尽我所能将它们拼合起来,所以请耐心等待。
我对如何正确处理标签感到非常困惑。例如,在下面的代码位中,“ bne”转换为“ 00010101001001010000000000000001”,并且loopend的标签地址为0x00000020(32)
.text
la $a0, opOne
lw $a0, 0($a0)
la $a1, opTwo
lw $a1, 0($a1)
add $t0, $zero, $a0
addi $t1, $zero, 1
bne $t1, $a1, loopend
addi $t1, $t1, 1
loopend:
Run Code Online (Sandbox Code Playgroud)
当我向上移动loopend时,“ bne”变为“ 00010101001001011111111111111111”,loopend的地址变为0x00000008(8)
.text
la $a0, opOne
lw $a0, 0($a0)
loopend:
la $a1, opTwo
lw $a1, 0($a1)
add $t0, $zero, $a0
addi $t1, $zero, 1
bne $t1, $a1, loopend
addi $t1, $t1, 1
Run Code Online (Sandbox Code Playgroud)
因此,据我了解,在代码的第一位loopend是在八条指令之后,因此它的地址是4 * 8 = 32 = 0x00000020。在代码的第二位中,loopend是在两条指令之后,因此其地址为4 * 2或0x00000008。 …
我已经多次读过编译器将高级代码翻译成机器语言,每当我谷歌"机器语言"它告诉我它是汇编语言.另一方面,当我用记事本打开用c ++编写的hello world应用程序时,它向我展示了除了汇编之外的任何东西.实际上这个东西背后的秘密是什么,以及二进制和位进入的位置是什么?请解决我的困惑.
我在一些帖子/视频/文件中看到它们是零填充的,看起来比它们更大,或者匹配一些文件系统实用程序用于移动文件的"相同文件大小"标准,大多数它们是恶作剧程序或恶意软件.
但我经常想知道,如果文件损坏会发生什么,并且会"加载"文件末尾的大零填充空间中的下一组"指令"?
会发生什么事吗?什么是指令集0x0?
我编译以下程序gcc并接收输出可执行文件a.out.:
#include <stdio.h>
int main () {
printf("hello, world\n");
}
Run Code Online (Sandbox Code Playgroud)
当我执行时cat a.out,为什么文件是"乱码"(这叫什么?)而不是0和1的机器语言:
??????? H__PAGEZERO(__TEXT__text__TEXT?`??__stubs__TEXT
P__unwind_info__TEXT]P]__eh_frame__TEXT?H??__DATA__program_vars [continued]
Run Code Online (Sandbox Code Playgroud) 有没有办法强制编译器或汇编器只生成 RIP 相关的寻址代码?
我试图找到一种方法来提供从传统编程模型到图灵完备抽象计算模型的映射。
assembly x86-64 machine-language machine-code relative-addressing
我在 C 中有一个代码,它只是打印 hello world,就像这样
#include <stdio.h>
int main(void)
{
printf("Hello, world\n");
}
Run Code Online (Sandbox Code Playgroud)
为了在 ubuntu 中编译代码,我使用了命令
make filename,它给了我这样的汇编代码:
.text
.file "hello.c"
.globl main
.align 16, 0x90
.type main,@function
main: # @main
.cfi_startproc
# BB#0:
pushq %rbp
.Ltmp0:
.cfi_def_cfa_offset 16
.Ltmp1:
.cfi_offset %rbp, -16
movq %rsp, %rbp
.Ltmp2:
.cfi_def_cfa_register %rbp
subq $16, %rsp
movabsq $.L.str, %rdi
movb $0, %al
callq printf
xorl %ecx, %ecx
movl %eax, -4(%rbp) # 4-byte Spill
movl %ecx, %eax
addq $16, %rsp
popq %rbp
retq
.Lfunc_end0: …Run Code Online (Sandbox Code Playgroud) 我有一些关于机器语言的问题:
如何编写机器语言代码?这实际上完成了吗?
架构的哪一部分处理机器语言?(英特尔或amd芯片?还有什么?)
每台机器都有不同的机器语言吗?
在此先感谢您的答案:)
assembly ×6
c ×3
c++ ×2
addressing ×1
executable ×1
file ×1
hexdump ×1
kernel ×1
labels ×1
lisp ×1
machine-code ×1
mips ×1
racket ×1
s-expression ×1
x86-64 ×1
xxd ×1
zero-padding ×1