你如何组装一个汇编程序?

我想制作一个简单的x86汇编程序。 我想知道是否有任何教程制作自己的汇编程序。 或者如果有一个简单的汇编程序,我可以学习。

另外,我想知道用什么工具来查看和处理程序的二进制/hex。

这是你在找什么:

汇编程序和装载机 – David Salomon。 1993年2月出版 – 免费提供( 在这里下载 )

当然,你将需要以下内容:

  1. 英特尔®64和IA-32架构软件开发人员手册
  2. AMD-64体系结构程序员手册
  3. John R. Levine的链接器和装载器(免费)
  4. ELF文件格式规范: 系统V ABI更新
  5. Microsoft可移植可执行文件和通用目标文件格式规范

你总是可以参考Opensource Assemblers的实现:

  1. Netwide Assembler(NASM)
  2. Gnu汇编程序(GAS)

在Delphi 7中只是一小段代码。

{$APPTYPE CONSOLE} program assembler; uses sysutils; const s1=#0#77#1#90#59#64#4#80#1#69#3#76#1#1#1#1#14#224#2#15#1#1#1#11#1#1#1#1#1#64#13+ #116#1#16#13#64#3#16#4#2#3#1#8#3#2#10#7#32#4#2#7#3#5#16#4#16#5#1#10#16#13#16#3+ #184#124#184#5#16#3#184#5#2#15#96#3#224#173#52#1#16#3#40#1#16#23#65#1#16#3#80#1+ #16#7#75#1#69#1#82#1#78#1#69#1#76#1#51#1#50#1#46#1#68#1#76#1#76#4#71#1#101#1+ #116#1#83#1#116#1#100#1#72#1#97#1#110#1#100#1#108#1#101#4#87#1#114#1#105#1#116+ #1#101#1#67#1#111#1#110#1#115#1#111#1#108#1#101#1#65#2#72#1#101#1#108#1#108#1+ #111#1#44#1#32#1#87#1#111#1#114#1#108#1#100#1#33#1#13#1#10#5#0; s3=#1#185#1#7#4#136#1#195#1#128#1#227#1#15#1#193#1#216#1#4#1#128#1#251#1#9+ #1#118#1#3#1#128#1#195#1#39#1#128#1#195#1#48#1#136#1#153#1#96#1#16#1#64#2#73#1+ #125#1#228#1#106#2#104#1#112#1#16#1#64#2#106#1#8#1#104#1#96#1#16#1#64#2#106#1+ #245#1#255#1#21#1#40#1#16#1#64#2#80#1#255#1#21#1#44#1#16#1#64#2#195; var f:file of byte;p,i:integer;o:string; t:text;line:string; procedure w(s: string); begin i:=1; while i<length(s) do begin inc(p,ord(s[i])); setlength(o, p); o[p]:=s[i+1]; inc(i,2); end; end; procedure al(b: byte); var a: longword;pc: pchar; begin a := strtoint(line); pc:=@a; o := o + chr(b) + pc^ + (pc+1)^ + (pc+2)^ + (pc+3)^; inc(p,5); // mov eax, imm32 end; begin assign(f,'out.exe'); rewrite(f); p:=1; w(s1); assignfile(t, ''); reset(t); while not eof(t) do begin readln(t, line); line := trim(line); if copy(line,1,8) = 'mov eax,' then begin system.delete(line,1,8); al($b8); // mov eax, imm32 end else if copy(line,1,8) = 'add eax,' then begin system.delete(line,1,8); al($05); // add eax, imm32 end else if copy(line,1,8) = 'and eax,' then begin system.delete(line,1,8); al($25); // and eax, imm32 end end; closefile(t); w(s3); blockwrite(f,o[1],p); close(f); end. 

汇编器只理解三个不同的汇编代码“mov eax,immed32”,“add eax,immed32”,“和eax,immed32”,没有数据和标签。 它会产生一个微小的Windows PE可执行文件,最后在hex输出eax。

注意:在我的情况下,avira free antivirus不喜欢输出。 这是一个误报。 我不得不closures实时保护。 如果您不确定这是否是恶意软件,请使用debugging器检查结果(不是!)

至于示例代码去…

不过,我不知道任何“简单”的汇编程序。

我很久以前写了一个。 就像从Intel获得x86汇编程序引导指南一样简单,并将字节写入.com文件(对于Windows)。 我希望我能find我的旧论坛发表。 它是用D ++编写的。 只是去显示你可以用任何语言做到这一点。 只是标记你的string并翻译它。