你是如何组装的?

mud*_*dge 53 x86 assembly

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

另外,我想知道在查看和处理程序的二进制/十六进制时使用了什么工具.

cla*_*aws 49

这就是你要找的东西:

装配工和装载工 - 大卫·萨洛蒙.19932月出版 - 免费提供(此处下载)

当然,您需要以下内容:

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

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

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

  • 我想在这个答案中添加一点,但以评论的形式:查看此链接:http://www.plantation-productions.com/Webster/RollYourOwn/index.html (2认同)

Nil*_*lsB 6

在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.
Run Code Online (Sandbox Code Playgroud)

汇编程序仅理解三个不同的汇编程序代码“ mov eax,immed32”,“ add eax,immed32”,“ and eax,immed32”,并且没有数据或标签。它将生成一个微小的Windows PE可执行文件,该文件最后输出十六进制的eax。

注意:就我而言,免费的avira防病毒软件不喜欢其输出。这是一个误报。我必须关闭实时保护。如果不确定这是否是恶意软件,请使用调试器检查结果(不是!)

  • 为什么用Delphi而不用C或C ++?我认为不再有使用Delphi的软件生成器。您可以翻译此代码C或C ++吗? (3认同)

Jer*_*oyd 5

我很久以前写过一篇。就像从 Intel 获取 x86 汇编器参考指南并将字节写入 .com 文件(适用于 Windows)一样简单。我希望我能找到我在上面发表的旧论坛帖子。它是用D++编写的。只是为了证明您可以用任何语言做到这一点。只需标记您的字符串并翻译它即可。