我正处于一个级别的中间,我正在为我的计算机考试做一些修改.我想知道是否有人能告诉我机器代码和目标代码之间的区别.
请保持简单.
我被赋予了以下任务:
请考虑以下十六进制值序列:
55 89 E5 83 EC 08 83 E4 F0 31 C9 BA 01 00 00 00 B8 0D 00 00 00 01 D1 01 CA 48 79 F9 31 C0 C9 C3
此字节序列表示32位模式下Intel 80386机器语言的子例程.
执行此子例程中的指令时,它们会在寄存器%ecx和%edx中保留值.有什么价值?
C中执行该子程序计算的程序是什么,然后打印由%ecx和%edx的程序计算的值,就像在子程序执行结束时出现的那样.
由于我没有记忆80386指令集,我必须首先将这些操作码字节转换为它们的汇编语言助记符.那么,是否有某个在线参考,一个表格将十六进制值映射到指令等?我查看了英特尔的网站,但什么都找不到.或者有更好的方法来破译这个......?
或者是否有这种工作的工具?
我还想获得每条指令的相应机器代码.
谁能告诉我"0x48ff25"在下面的disassamble代码中意味着什么?
00000000`7745b0ac 48ff2525801000 jmp qword ptr [ntdll!NlsAnsiCodePage+0xe3e (00000000`775630d8)]
Run Code Online (Sandbox Code Playgroud)
我已经检查了AMD64架构程序员的手册,但我自己很难找到答案......
我一直在考虑机器代码如何特定于架构以及Javascript如何在(几乎)每个浏览器中工作.我一直在研究一个必须做一些严肃计算的项目,它是基于Javascript的,需要一分钟才能完成计算.它让我渴望C的速度.但是项目使用Javascript的全部原因是为了简单和便携.
这给了我一个想法,如果有一种类似于Javascript的语言,就像在每个架构上一样可移植并作为可执行文件运行,该怎么办?大多数人会指向Java,但我正在考虑一些开销较少且由操作系统处理的东西.不是字节代码,而是本机机器代码.
做了一些研究和思考,以实现这项任务的不可能性.您如何制作一个像普通C编写的应用程序一样小的可执行文件,该应用程序适用于在每个体系结构上工作的特定体系结构,速度与在C中为该体系结构本地编译的速度相同?
这是我的下一个想法.本机机器代码特定于架构,每个架构都具有某些特殊功能,有时以不同方式处理相同的任务.某些优化也是针对每个体系结构的.如果有通用机器代码怎么办?当操作系统将指令加载到ram中时,它会自动转换指令以适应架构.或许(更疯狂的想法)CPU可以包含接收通用机器代码并自动将通用机器代码调整到其本机代码中的能力?
通用机器代码规范必须足够通用,以涵盖正常的机器代码功能.
当然,如果通用机器代码确实有效,人们可能会想要一个由所有操作系统处理的通用可执行格式.这样,可执行文件不需要在OS上进行更改.这导致需要专门针对机器进行通用的框架.更多的细节将是操作系统特定的功能,输入和输出的能力超出我所知的范围.
Universal Machine Code编译可执行文件:
优点:
缺点:
这可行吗?
编辑:
我用过Java,在其中制作游戏.它不像我想的那样普遍,也不像友好.*它是由Oracle维护的自己的编程语言.专有和有点太大.需要在某些机器上安装.
更具体地说,我不是在谈论使用新的编程语言.我正在谈论拥有一种新的机器代码语言,该语言拥有足够的额外信息,在执行时,会将一个非常薄的过程转换为架构的机器代码.这样C编译器就可以将它们的可执行文件编译成通用机器代码,并且可执行文件可以在任何地方运行.
assembly computer-science machine-code computer-architecture
在查看x86操作码映射时,例如:
http://www.mlsite.net/8086/#tbl_map1
它定义了映射,例如:
00: ADD Eb,Gb
01: ADD Ev,Gv
...
Run Code Online (Sandbox Code Playgroud)
该链接具有字母含义的基本描述,例如:
- E:操作码后面有一个ModR/M字节并指定操作数.操作数是通用寄存器或存储器地址.如果它是存储器地址,则从段寄存器和以下任何值计算地址:基址寄存器,索引寄存器,位移.
- b:字节参数.
但它有点太模糊了.你如何将其转化为"完整的操作码"(操作码中的整个指令+ args)?还没有能够从英特尔手册中找到它,也许我在寻找错误的地方(而且有点压倒性的)?看到显示输入指令的输出操作码的片段(以及你是如何做到的)将是非常有用的.
假设,我有一个用C编写的程序,我有两台相同的计算机,一台运行Windows,另一台运行Linux.由于计算机是相同的,它们的处理器具有相同的指令集,因此编译后的机器代码应该相同.那么为什么我需要两次编译我的程序呢?假设,我不会调用任何与操作系统相关的功能,或者取决于实际操作系统的功能.
我对Z80和机器码很新,所以请不要认为我知道任何事情.
基本上,我想知道的是:如果你H用一个值加载寄存器(我会称之为y),HL那么0xy0呢?例如,如果H装有0xAF会HL是0xAF00?加载L时也一样y吗?
提前致谢.
我正在尝试为不允许 0x00 字节的 CTF 挑战编写 shellcode(它将被解释为终止符)。由于挑战的限制,我必须做这样的事情:
[shellcode bulk]
[(0x514 - sizeof(shellcode bulk)) filler bytes]
[fixed constant data to overwrite global symbols]
[shellcode data]
Run Code Online (Sandbox Code Playgroud)
它看起来像这样
.intel_syntax noprefix
.code32
shellcode:
jmp sc_data
shellcode_main:
#open
xor eax, eax
pop ebx //file string
xor ecx, ecx //flags
xor edx, edx //mode
mov al, 5 //sys_OPEN
int 0x80
... // more shellcode
.org 514, 0x41 // filler bytes
.long 0xffffffff // bss constant overwrite
sc_data:
call shellcode_main
.asciz "/path/to/fs/file"
Run Code Online (Sandbox Code Playgroud)
如果sc_data在shellcode. 在这种情况下,汇编器 …
我正在同时阅读各种有关计算机体系结构的书籍,我感到困惑。一些书指出,汇编指令只是机器指令的助记符,每条指令恰好对应于一条机器指令。但是,Tanenbaum的结构化计算机组织将程序集放置在操作系统之上,并且似乎暗示程序集以某种方式使用了操作系统(我尚未阅读整本书...)
哪一个是对的?组装说明仅仅是机器说明吗?它们也可以是操作系统解释为机器指令的系统调用吗?他们还能成为别的东西吗?
machine-code ×10
assembly ×8
x86 ×3
disassembly ×2
c ×1
compilation ×1
cpu ×1
execution ×1
high-level ×1
intel ×1
linker ×1
object-code ×1
shellcode ×1
x86-64 ×1
z80 ×1