Chỉ cần một mảnh rất nhỏ mã trong 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:[email protected];
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.
Các lắp ráp hiểu chỉ có ba mã lắp ráp khác nhau "mov eax, immed32", "add eax, immed32", "và eax, immed32" và không có dữ liệu cũng không nhãn. Nó sẽ tạo ra một tệp thực thi Windows PE nhỏ xíu có thể xuất ra eax trong hex ở cuối.
Chú ý: Trong trường hợp của tôi, vi-rút miễn phí avira không thích đầu ra. Đó là một dương tính giả. Tôi phải tắt bảo vệ thời gian thực. Kiểm tra kết quả bằng trình gỡ rối nếu bạn không chắc chắn đây có phải là phần mềm độc hại hay không (Không phải!)
Tôi muốn phát triển trình kết hợp trong C. – mudge
Một số tài liệu được liệt kê trong http://stackoverflow.com/questions/1669/ học tập-để-viết-một-trình biên dịch có thể địa chỉ này như là một giai đoạn biên dịch (và một số có lẽ không). [[Liên quan, * không * một bản sao.]] – dmckee
Ngoài ra hãy xem @ "Làm thế nào để viết một disassembler?" http: // stackoverflow.com/questions/924303/how-to-write-a-disassembler – claws