mã máy x86, 162 byte
PROG.COM Tải xuống và chạy nó trong trình giả lập MS-DOS , ví dụ như DOSBox .
90 B3 B4 B4 02 90 90 B3 B2 B2 48 90 90 B3 CD CD 21 90 90 B3 B2 B2 65 90
90 B3 CD CD 21 90 90 B3 B2 B2 6C 90 90 B3 CD CD 21 90 90 B3 CD CD 21 90
90 B3 B2 B2 6F 90 90 B3 CD CD 21 90 90 B3 B2 B2 2C 90 90 B3 CD CD 21 90
90 B3 B2 B2 20 90 90 B3 CD CD 21 90 90 B3 B2 B2 77 90 90 B3 CD CD 21 90
90 B3 B2 B2 6F 90 90 B3 CD CD 21 90 90 B3 B2 B2 72 90 90 B3 CD CD 21 90
90 B3 B2 B2 6C 90 90 B3 CD CD 21 90 90 B3 B2 B2 64 90 90 B3 CD CD 21 90
90 B3 B2 B2 21 90 90 B3 CD CD 21 90 90 B3 CD CD 20 90
Sau khi gỡ bỏ Tải xuống MINI.COM
90 B4 02 90 B2 48 90 CD 21 90 B2 65 90 CD 21 90 B2 6C 90 CD 21 90 CD 21
90 B2 6F 90 CD 21 90 B2 2C 90 CD 21 90 B2 20 90 CD 21 90 B2 77 90 CD 21
90 B2 6F 90 CD 21 90 B2 72 90 CD 21 90 B2 6C 90 CD 21 90 B2 64 90 CD 21
90 B2 21 90 CD 21 90 CD 20
Làm thế nào để chạy?
Cài đặt DOSBox, cho Ubuntu / Debian
sudo apt install dosbox
Chạy nó
dosbox
Trong DOSBOX
mount c /home/user/path/to/your/directory
c:
PROG.COM
MINI.COM
Nó làm việc như thế nào?
Mã hoạt động của máy đại diện cho hướng dẫn ngôn ngữ lắp ráp .
Trong MS-DOS để in char, bạn sẽ thiết lập các thanh ghi và thực hiện ngắt. Thanh ghi AH sẽ là 0x02, thanh ghi DL chứa char của bạn. Vectơ ngắt là 0x21.
mov ah,0x2 ;AH register to 0x2 (B4 02)
mov dl,0x48 ;DL register to "H" (B2 48)
int 0x21 ;0x21 interrupt (CD 21)
Mô hình tập tin COM của MS-DOS rất tốt, vì nó không có bất kỳ tiêu đề nào . Nó bị giới hạn bởi 64K, nhưng trong trường hợp của chúng tôi thì không vấn đề gì.
Để dừng chương trình, sử dụng ngắt 0x20
int 0x20 ;0x20 interrupt (CD 20)
ma thuật
Nếu bạn muốn thực thi lệnh opcode 0xAB với một tham số 0xCD , bạn viết
AB CD
Trong PROG.COM
90 B3 AB AB CD 90
nop ; No operation (90)
mov bl,0xb4 ; BL register to AB (B3 AB)
AB CD command (AB CD)
nop ; No operation (90)
Trong MINI.COM
90 AB CD
nop ; No operation (90)
AB CD command (AB CD)
Đó là mã máy bằng nhau , nếu bạn không sử dụng thanh ghi BL .
Máy phát điện
Chuyển đổi tập tin văn bản với hex thành hex nhị phân
cat hex_file | xxd -r -p > exec.com
function byte2hex(byte){
var ret=byte.toString(16).toUpperCase();
return ret.length==1 ? "0"+ret : ret;
}
function str2hex(str){
var ret = [];
for(var i=0;i<str.length;i++){
ret.push(byte2hex(str.charCodeAt(i)));
}
return ret;
}
function genCode(hexArr){
var ret = [["B4","02"]];
for(var i=0;i<hexArr.length;i++){
if(hexArr[i]!=hexArr[i-1]){
ret.push(["B2",hexArr[i]]);
}
ret.push(["CD","21"]);
}
ret.push(["CD","20"]);
return ret;
}
function magicCode(str){
var ret=[""];
var code=genCode(str2hex(str));
for(var i=0;i<code.length;i++){
ret.push("90 B3 "+code[i][0]+" "+code[i][0]+" "+code[i][1]+" 90");
if(i%4==3){ret.push("\n");}
}
return ret.join(" ");
}
function magicCodeMinified(str){
var ret=[""];
var code=genCode(str2hex(str));
for(var i=0;i<code.length;i++){
ret.push("90 "+code[i][0]+" "+code[i][1]);
if(i%8==7){ret.push("\n");}
}
return ret.join(" ");
}
var str=prompt("string","Hello, world!");
var out="PROG.COM\n" + magicCode(str)+"\n\nMINI.COM\n"+magicCodeMinified(str);
document.write(out.replace("\n","<br>"));
alert(out);