Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Asm для Windows/Dos > программа, выводящая сама себя


Автор: piritus 26.2.2007, 18:57
Здравствуйте
меня вдруг заинтересовал данный вопрос:
как программа на asm может вывести свое содержимое на экран?
есть какие-нибудь мысли по этому поводу?

Автор: anwe 26.2.2007, 19:57
Что значит свое содержимое? Свой код? Если да то первый вариант - запустить дизассемблер с именем файла, что совпадает с твоим. Второй - найти файл с расширением .asm и именем, совпадающим с именем программы и раскрыть его в бокноте.

Автор: Akina 26.2.2007, 19:59
У программы нет содержимого. Это не стакан...

Автор: Hovl 26.2.2007, 20:28
Я думаю, имелось ввиду что-то типа:

на Java:
Код

package test; 
public class Reproduce { 
static String str="package test;%2$1cpublic class Reproduce {%2$1cstatic String str=%3$1c%1$1s%3$1c;%2$1cpublic static void main(String []args){System.out.printf(str,str,'%4$1cn','%4$1c%3$1c','%4$1c%4$1c');}}"; 
public static void main(String[] args){System.out.printf(str,str,'\n','"','\\');}}


или на C++:
Код

#include <stdio.h> 
void main(char*a){printf(a,34,a="main(char*a){printf(a,34,a=%c%s%c,34;}",34);}


Только вот на асм, я думаю, можно вывести только в HEX или пиши дизасм свой и в стеке себя декодируй...

Автор: piritus 26.2.2007, 20:38
давайте не будем ехидничать
и умничать про стакан

Hovl правильно понял, что имелось в виду (неужеле вы глупее?)

вот к примеру нашел на паскале:

Код

program Project1;
Uses SysUtils; var s:array[1..10] of string;i:integer;
begin
s[1]:='program Project1;';
s[2]:='Uses SysUtils; var s:array[1..10] of string;i:integer;';
s[3]:='begin';
s[4]:='for i:=1 to 3 do writeln(s[i]);';
s[5]:='For i:=1 to 7 do writeln(format(''s[%d]:=''''%s'''''',[i,s[i]]));';
s[6]:='for i:=4 to 7 do writeln(s[i]);';
s[7]:='end.';
for i:=1 to 3 do writeln(s[i]);
For i:=1 to 7 do writeln(format('s[%d]:=''%s''',[i,s[i]]));
for i:=4 to 7 do writeln(s[i]);
end.


Автор: sgi1981 27.2.2007, 00:04
Это уже зависит от платформы.

Автор: piritus 27.2.2007, 12:36
да ДОС, какая еще

Автор: anwe 27.2.2007, 14:27
А сделай как я предложил smile 

Автор: piritus 27.2.2007, 15:37
нужно, что бы результат был на подобии 
Код

void main(char*a){printf(a,34,a="main(char*a){printf(a,34,a=%c%s%c,34;}",34);}

Автор: JAPH 2.3.2007, 20:03

Приветствую всех.
Если требуется вариант как приведённые выше, то что-то вроде этого:
Код

dseg    segment
prog    db      "dseg   segment", 0Dh, 0Ah
        db      "prog   db      'And here again the whole program?!', 24h", 0Dh, 0Ah
        db      "dseg   ends", 0Dh, 0Ah
        db      "cseg   segment", 0Dh, 0Ah
        db      "       assume  cs:cseg, ds:dseg, ss:sseg", 0Dh, 0Ah
        db      "@:     mov     ax, dseg", 0Dh, 0Ah
        db      "       mov     ds, ax", 0Dh, 0Ah
        db      "       mov     ah, 09h", 0Dh, 0Ah
        db      "       lea     dx, prog", 0Dh, 0Ah
        db      "       int     21h", 0Dh, 0Ah
        db      "       mov     ax, 4C00h", 0Dh, 0Ah
        db      "       int     21h", 0Dh, 0Ah
        db      "cseg   ends", 0Dh, 0Ah
        db      "sseg   segment stack", 0Dh, 0Ah
        db      "       db      0400h dup (?)", 0Dh, 0Ah
        db      "sseg   ends", 0Dh, 0Ah
        db      "       end     @", 0Dh, 0Ah, 24h
dseg    ends
cseg    segment
        assume  cs:cseg, ds:dseg, ss:sseg
@:      mov     ax, dseg
        mov     ds, ax
        mov     ah, 09h
        lea     dx, prog
        int     21h
        mov     ax, 4C00h
        int     21h
cseg    ends
sseg    segment stack
        db      0400h dup (?)
sseg    ends
        end     @


Но имхо лучше
Код

dseg    segment
prog    db      'prog.asm', 0
buf     db      ?
dseg    ends
cseg    segment
        assume  cs:cseg, ss:sseg, ds:dseg
@:      mov     ax, dseg
        mov     ds, ax
        lea     dx, prog
        mov     ax, 3D00h
        int     21h
        jc      @quit
        mov     bx, ax
        mov     cx, 0001h
@1:     lea     dx, buf
        mov     ah, 3Fh
        int     21h
        test    ax, ax
        jz      @quit
        mov     dl, buf
        mov     ah, 02h
        int     21h
        jmp     short @1
@quit:  mov     ax, 4C00h
        int     21h
cseg    ends
sseg    segment stack
        db      0400h dup (?)
sseg    ends
        end     @


Автор: 10110111 16.3.2007, 15:03
Можно и без исходника рядом с исполняемым файлом вывести код на экран.Вот, зацените... аттач
P.S.: правда, с перенаправлением в файл будут проблемы из-за int29...

Автор: piritus 17.3.2007, 09:52
интересное решение, благодарю

Автор: Maka6er 6.5.2007, 00:06
Кстати такие программы называются "Куин" (англ. quine)

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)