рд▓реЛ рд▓реЗрд╡рд▓ рдмреНрд░реЗрдирдлрдХ

рднрд╛рдЧ I
рднрд╛рдЧ II
рднрд╛рдЧ III

рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ, рд╣рдо TurboAssembler рдкрд░ рдПрдХ Brainfuck рд╕рдВрдХрд▓рдХ рд▓рд┐рдЦреЗрдВрдЧреЗ
рдпрд╣рд╛рдВ рдЖрдк рдЪрд░рдг-рджрд░-рдЪрд░рдг рдореЛрдб рдореЗрдВ bf- рдкреНрд░реЛрдЧреНрд░рд╛рдо рдбрд┐рдмрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╣рдо рджреБрднрд╛рд╖рд┐рдпрд╛ рдХреЛ рдХреБрдЫ рдЙрдЪреНрдЪ-рд╕реНрддрд░реАрдп рднрд╛рд╖рд╛ рдореЗрдВ рд▓рд┐рдЦреЗрдВрдЧреЗ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдкрд╛рд╕реНрдХрд▓ рдореЗрдВред

Data_arr рд╕рд░рдгреА рдбреЗрдЯрд╛ рдореЗрдореЛрд░реА рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░реЗрдЧреА, str_arr рд╕реНрдЯреНрд░рд┐рдВрдЧ рдореЗрдВ рдХрдорд╛рдВрдб рд╣реЛрдВрдЧреЗред

рд╣рдо рдПрдХ рдРрд╕рд╛ рдкреНрд░реЛрдЧреНрд░рд╛рдо рд▓рд┐рдЦреЗрдВрдЧреЗ рдЬреЛ рдПрдХ рдРрд╕реЗ рдЪрд░рд┐рддреНрд░ рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддрд╛ рд╣реИ рдЬрд┐рд╕рдХрд╛ рдПрд╕рд╕реА рдХреЛрдб рд╕рдВрдЦреНрдпрд╛ + рд╕реЗ рдореЗрд▓ рдЦрд╛рддрд╛ рд╣реИ (рдЗрд╕рд▓рд┐рдП рд╣рдореЗрдВ рдХреЗрд╡рд▓ + рдФрд░ рдХрдорд╛рдВрдб рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ)

var data_arr:array[1..10] of integer; //   str_arr: string; //  i, j: integer; //     begin j:=1; //       readln(str_arr); //  for i:=1 to length(str_arr) do begin //     if (str_arr[i]='+') then data_arr[j]:= data_arr[j]+1; if (str_arr[i]='.') then write(chr(data_arr[j])); end; end. 

bf рдХреЛрдб +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ рдмрд╛рд╣рд░ рджреЗ рджреЗрдВрдЧреЗ ! (рдЪрд░рд┐рддреНрд░ рдХреЗ ascii рдХреЛрдб ! 33 рд╣реИ)ред

рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЛ рдСрдирд▓рд╛рдЗрди ide ideone.com рдкрд░ рдЪреЗрдХ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ

рдЕрдЧрд▓рд╛, рдЧреЛрдЯреЛ рдХреЗ рд╕рд╛рде рд▓реВрдк рдХреЗ рд▓рд┐рдП рдмрджрд▓реЗрдВ рдФрд░ рдХрдорд╛рдВрдб рдЬреЛрдбрд╝реЗрдВ тИТ<>
рдЕрдВрдд рдореЗрдВ, рд╣рдо data_arr array рдХреЛ рдЖрдЙрдЯрдкреБрдЯ рдХрд░реЗрдВрдЧреЗ

 LABEL prev,next; var data_arr:array[1..10] of integer; //   str_arr: string; //  i,j,k: integer; //     begin i:=1; j:=1; readln(str_arr); //  prev: if i>length(str_arr) then goto next; if (str_arr[i]='+') then data_arr[j]:= data_arr[j]+1; if (str_arr[i]='-') then data_arr[j]:= data_arr[j]-1; if (str_arr[i]='>') then j:=j+1; if (str_arr[i]='<') then j:=j-1; if (str_arr[i]='.') then write(chr(data_arr[j])); i:=i+1; goto prev; next: for k:=1 to 10 do begin write(data_arr[k]); write(' '); end; end. 

рдХреЛрдб +>++>+++1 2 3 0 0 0 0 0 0 рджреЗрдЧрд╛
рдХреЛрдб +>++>+++тИТ1 2 2 0 0 0 0 0 0 рджреЗ рджреЗрдВрдЧреЗ
ideone.com

рдЗрд╕рдХреЗ рдмрд╛рдж, [ рдФрд░ ] рдЬреЛрдбрд╝реЗрдВ
рдПрдХ рдФрд░ i_stor рд╡реИрд░рд┐рдПрдмрд▓ рдЬреЛрдбрд╝реЗрдВред
рдпрджрд┐ рд╡рд░реНрддрдорд╛рди рддрддреНрд╡ рдиреЗ рдкрд░реАрдХреНрд╖рдг рдХреЛ [ рдкрд░ рдЙрддреНрддреАрд░реНрдг рдХрд┐рдпрд╛ рд╣реИ, рддреЛ рд╣рдо data_arr рд╕рд░рдгреА рдХреЗ рд╡рд░реНрддрдорд╛рди рддрддреНрд╡ рдХреЛ рд╢реВрдиреНрдп рдкрд░ рдЪреЗрдХ рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдпрджрд┐ рддрддреНрд╡ рд╢реВрдиреНрдп рд╕реЗ рдЕрдзрд┐рдХ рд╣реИ, рддреЛ рдЪрд░ рдХреЛ i_stor рд╕реЗ рдорд╛рди рд▓реЛрдб рдХрд░реЗрдВред

рд╕рдорд╛рдкрди рдмреНрд░реИрдХреЗрдЯ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рддреЗ рд╕рдордп ] , рдпрджрд┐ data_arr рд╢реВрдиреНрдп рдирд╣реАрдВ рд╣реИ, рддреЛ рд╣рдо рд╡реЗрд░рд┐рдПрдмрд▓ i_stor рд╕реЗ рд╡реЗрд░рд┐рдПрдмрд▓ рдореЗрдВ рдУрдкрдирд┐рдВрдЧ рдмреНрд░реИрдХреЗрдЯ рдХрд╛ рдкрддрд╛ рд▓реЛрдб рдХрд░рддреЗ рд╣реИрдВред

рдЕрдЧрд▓рд╛, рдХрдорд╛рдВрдб рдкрд░ рдЬрд╛рдПрдВ i: = i + 1;
рдпрджрд┐ рдЗрд╕рд╕реЗ рдкрд╣рд▓реЗ i_stor рд╕реЗ рдПрдХ рдорд╛рди i (рд╕рддреНрдпрд╛рдкрди рдХреЗ рджреМрд░рд╛рди) рдореЗрдВ рд▓реЛрдб рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рддреЛ рдбрдВрдк рдХреЗ рдмрд╛рдж рд╣рдо [ (рдЕрдиреНрдпрдерд╛ рд╣рдо рдЕрдВрджрд░ рд╣реЛрдВрдЧреЗ)
 LABEL prev,next; var data_arr:array[1..10] of integer; //   str_arr: string; //  i,j,k: integer; //     i_stor: integer; begin j:=1; i:=1; readln(str_arr); //  prev: if i>length(str_arr) then goto next; if (str_arr[i]='+') then data_arr[j]:= data_arr[j]+1; if (str_arr[i]='-') then data_arr[j]:= data_arr[j]-1; if (str_arr[i]='>') then j:=j+1; if (str_arr[i]='<') then j:=j-1; if (str_arr[i]='.') then write(chr(data_arr[j])); if (str_arr[i]='[') then begin if data_arr[j]>0 then i_stor:=i; end; if (str_arr[i]=']') then begin if data_arr[j]>0 then begin i:=i_stor; end; end; i:=i+1; goto prev; next: for k:=1 to 10 do begin write(data_arr[k]); write(' '); end; end. 

рдХреЛрдб +++++[>+<тИТ]рдирдВрдмрд░ 5 рдХреЛ рдЕрдЧрд▓реА рд╕реЗрд▓ рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рддрд╛ рд╣реИ 0 5 0 0 0 0 0 0 0 0 0
ideone.com
HelloWorld рдХреЛрдб ideone.com рдЬреИрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИ

рдЪрд▓реЛ рдХреЛрдбрд╛рдВрддрд░рдХ рдХреЗ рд▓рд┐рдП рдЖрдЧреЗ рдмрдврд╝рддреЗ рд╣реИрдВ


рд▓реВрдк (рд▓реВрдк) рдХреЛ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╕реАрдПрдХреНрд╕ рд░рдЬрд┐рд╕реНрдЯрд░ рдореЗрдВ рдШрдбрд╝реА рдХреЗ рдЪрдХреНрд░ рдХреА рд╕рдВрдЦреНрдпрд╛ рдбрд╛рд▓рдирд╛ рдФрд░ рдПрдХ рд▓реЗрдмрд▓ рдбрд╛рд▓рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИ рдЬрд┐рд╕рд╕реЗ рдЪрдХреНрд░ рдХреЗ рдЕрдВрдд рдореЗрдВ (рд▓реВрдк рдХрдорд╛рдВрдб рджреНрд╡рд╛рд░рд╛) рд╕рдВрдХреНрд░рдордг рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред

 mov CX, 28h ; -   prev: ;   ;  ;  ;   loop prev ;    prev 

Str_arr рдХрдорд╛рдВрдб рдХреА рдПрдХ рд╕рд░рдгреА рдмрдирд╛рдПрдВ, рд╡рд╣рд╛рдВ рдбрд╛рд▓реЗрдВ +++
рдПрдХ рдбреЗрдЯрд╛ рдРрд░реЗ data_arr рдмрдирд╛рдПрдБ, (рд╕реНрдкрд╖реНрдЯрддрд╛ рдХреЗ рд▓рд┐рдП) рд╡рд╣рд╛рдБ 1,1,1,1,1,1,1,1,1,1,1 рд░рдЦреЗрдВ

рдПрдХ рд▓реВрдк рдореЗрдВ, рдЪрд░рд┐рддреНрд░ рдХреЗ рд╕рд╛рде рд╡рд░реНрддрдорд╛рди рдЪрд░рд┐рддреНрд░ рдХреА рддреБрд▓рдирд╛ рдХрд░реЗрдВ +рдФрд░, рдпрджрд┐ рдЕрдХреНрд╖рд░ рд╕рдорд╛рди рд╣реИрдВ, рддреЛ рд╡рд░реНрддрдорд╛рди рд╕реЗрд▓ рдореЗрдВ 1 рд╕реЗ рдорд╛рди рдмрдврд╝рд╛рдПрдВред

 text segment ; bf1.asm assume cs:text, ds:data, ss:stk begin: ;   mov AX,data ;    mov DS,AX mov DL, str_arr ;   DL 1  mov CX, 0Ah ; 10  prev: cmp DL, 2Bh ;   + jne next ; ,    next mov BL, 00h ;   BL  inc data_arr[BX] ; ,      1 next: inc i ;       mov BL, i mov DL, str_arr [BX] loop prev mov AX, 4c00h ;   int 21h text ends data segment str_arr DB 2Bh,2Bh,2Bh,'$' ;  +++ data_arr DB 1,1,1,1,1,1,1,1,1,1,'$' ;  i DB 0 ;    data ends stk segment stack db 100h dup (0) ;  256  stk ends end begin 

рдХреЛрдбрд╛рдВрддрд░рдг (рдЕрдиреБрд╡рд╛рдж) tasm.exe bf1.asm рдХрдорд╛рдВрдб рджреНрд╡рд╛рд░рд╛ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ
рд▓рд┐рдВрдХрд┐рдВрдЧ tlink.exe bf1.obj рджреНрд╡рд╛рд░рд╛ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ

TurboDebagger рдбрд┐рдмрдЧрд░ рдореЗрдВ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдЪрд▓рд╛рдиреЗ рдХреЗ рдмрд╛рдж, рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдкрддрд╛ 0130 рд╕реЗ рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИ, рдХрдорд╛рдВрдб рд╕реНрдерд┐рдд рд╣реИрдВ +++
рдЕрдЧрд▓рд╛ рдбреЗрдЯрд╛ рд╕рд░рдгреА рд╣реИ рдЬрд┐рд╕рдореЗрдВ рд╣рдордиреЗ рдкрд╣рд▓рд╛ рддрддреНрд╡ рдмрджрд▓рд╛ рд╣реИ, рдлрд┐рд░ i рдЪрд░, рдЬреЛ рд▓реВрдк рдХреЗ рдирд┐рд╖реНрдкрд╛рджрди рдХреЗ рдмрд╛рдж 0Ah рдХреЗ рдмрд░рд╛рдмрд░ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред



рдЖрджреЗрд╢ рдЬреЛрдбрд╝реЗрдВ тИТ<>ред
02h рдЗрдВрдЯрд░рдкреНрдЯ рдлрдВрдХреНрд╢рди int 21h рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрд┐рд╕реА рдПрдХрд▓ рд╡рд░реНрдг рдХреЛ рдЖрдЙрдЯрдкреБрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, DL рдХреЛрдб рдореЗрдВ рд╡рд░реНрдг рдХреЛрдб рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдпрд╣ рдЖрд╡рд╢реНрдпрдХ рд╣реИ (рд╡реНрдпрд╡рдзрд╛рди рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ)ред

  mov AH,2 mov DL,   int 21h 

рд╣рдо рдкреВрд░рд╛ рдХрд╛рд░реНрдпрдХреНрд░рдо рд▓рд┐рдЦреЗрдВрдЧреЗ

 text segment ; bf2.asm assume cs:text,ds:data, ss:stk begin: ;   mov AX,data ;    mov DS,AX mov DL, str_arr ;   DL 1  mov CX, 0Ah ; 10  prev: cmp DL, 2Bh ;   + jne next ; ,    next mov BL, j ;   BL   inc data_arr[BX] ; ,      1 next: cmp DL, 2Dh ;   - jne next1 ; ,    next1 mov BL, j dec data_arr[BX] next1: cmp DL, 3Eh ;   > jne next2 ; ,    next2 inc j ; ,      data_arr next2: cmp DL, 3Ch ;   < jne next3 ; ,    next3 dec j ; ,      data_arr next3: cmp DL, 2Eh ;   . jne next4 ; ,    next4 mov AH,2 ; ,    mov BL, j mov DL, data_arr[BX] int 21h next4: inc i ;       mov BL, i mov DL, str_arr [BX] loop prev mov AX, 4c00h ;   int 21h text ends data segment str_arr DB 2Bh,3Eh,2Bh,2Bh,'$' ;  +>++ data_arr DB 0,0,0,0,0,0,0,0,0,0,'$' ;  i DB 0, '$' ;    j DB 0, '$' ;    data ends stk segment stack db 100h dup (0) ;  256  stk ends end begin 



рд▓реВрдк рдЗрд╕ рддрд░рд╣ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ:
рдЕрдЧрд░ str_arr рдХрд╛ рд╡рд░реНрддрдорд╛рди рддрддреНрд╡ рдирд╣реАрдВ рд╣реИ +рдлрд┐рд░ рдЕрдЧрд▓реЗ рд▓реЗрдмрд▓ рдкрд░ рдЬрд╛рдПрдВ : (рдЕрдиреНрдпрдерд╛, рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░реЗрдВ +)
рдЕрдЧрд░ str_arr рдХрд╛ рд╡рд░реНрддрдорд╛рди рддрддреНрд╡ рдирд╣реАрдВ рд╣реИ тИТрдлрд┐рд░ рдЕрдЧрд▓реЗ 1 рд▓реЗрдмрд▓ рдкрд░ рдЬрд╛рдПрдВ :
рдЕрдЧрд░ str_arr рдХрд╛ рд╡рд░реНрддрдорд╛рди рддрддреНрд╡ рдирд╣реАрдВ рд╣реИ >рдлрд┐рд░ рдЕрдЧрд▓реЗ 2 рд▓реЗрдмрд▓ рдкрд░ рдЬрд╛рдПрдВ :
рдЕрдЧрд░ str_arr рдХрд╛ рд╡рд░реНрддрдорд╛рди рддрддреНрд╡ рдирд╣реАрдВ рд╣реИ <рдлрд┐рд░ рдЕрдЧрд▓реЗ 3 рд▓реЗрдмрд▓ рдкрд░ рдЬрд╛рдПрдВ :
рдЕрдЧрд░ str_arr рдХрд╛ рд╡рд░реНрддрдорд╛рди рддрддреНрд╡ рдирд╣реАрдВ рд╣реИ $рдлрд┐рд░ рдЕрдЧрд▓реЗ 4 рд▓реЗрдмрд▓ рдкрд░ рдЬрд╛рдПрдВ :
рдЕрдЧрд▓реЗ рд▓реЗрдмрд▓ рдХреЗ рдмрд╛рдж : рд╕реНрдЯреНрд░рд┐рдВрдЧ str_arr рдХреЗ рд╕реВрдЪрдХрд╛рдВрдХ рдХреЛ рдмрдврд╝рд╛рдПрдВ рдФрд░ рд▓реВрдк рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ рдХреВрджреЗрдВ - рд▓реЗрдмрд▓ рдХреЗ рд▓рд┐рдП рдкреНрд░рдЪрд▓рд┐рдд :

рдЗрд╕рдХреЗ рдмрд╛рдж, [ рдФрд░ ] рдЬреЛрдбрд╝реЗрдВ
I_stor рд╡реИрд░рд┐рдПрдмрд▓ рдЬреЛрдбрд╝реЗрдВред

рдпрджрд┐ рд╡рд░реНрддрдорд╛рди рддрддреНрд╡ рдиреЗ рдкрд░реАрдХреНрд╖рдг рдХреЛ [ рдкрд░ рдЙрддреНрддреАрд░реНрдг рдХрд┐рдпрд╛ рд╣реИ, рддреЛ рд╣рдо data_arr array рдХреЗ рд╡рд░реНрддрдорд╛рди рддрддреНрд╡ рдХреЛ рд╢реВрдиреНрдп рдкрд░ рдЪреЗрдХ рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдпрджрд┐ рддрддреНрд╡ рд╢реВрдиреНрдп рд╣реИ, рддреЛ рд╣рдо рдЖрдЧреЗ (рдЕрдЧрд▓реЗ рд▓реЗрдмрд▓ рдкрд░) рдХреВрджрддреЗ рд╣реИрдВ, рдЕрдиреНрдпрдерд╛ рд╣рдо рд╡реИрд░рд┐рдПрдмрд▓ рд╕реЗ i_stor рдореЗрдВ рдорд╛рди рдХреЛ рд▓реЛрдб рдХрд░рддреЗ рд╣реИрдВред

 next4: cmp DL, 5Bh ;   [ jne next5 ; ,    next5 mov BL, j mov DL, data_arr[BX] cmp DL, 00 ; ,    data_arr   jz next5 ;  ,   mov DL, i ;   mov i_stor, Dl ;  i_stor   i next5: 

рд╕рдорд╛рдкрди рдХреЛрд╖реНрдардХ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рддреЗ рд╕рдордп ] , рдпрджрд┐ data_arr рд╢реВрдиреНрдп рдирд╣реАрдВ рд╣реИ, рддреЛ рдЪрд░ i_stor рд╕реЗ рдЪрд░ I рдореЗрдВ рдЙрджреНрдШрд╛рдЯрди рдмреНрд░реИрдХреЗрдЯ рдХрд╛ рдкрддрд╛ рд▓реЛрдб рдХрд░реЗрдВ

 next5: cmp DL, 5Dh ;   ] jne next6 ; ,    next6 mov BL, j mov DL, data_arr[BX] cmp DL, 00 ; ,    data_arr   jz next6 ;  ,   mov DL, i_stor ;   mov i, Dl ;  i_stor   i next6: 

рдХреЛрдб рдХреА рдЬрд╛рдБрдЪ рдХрд░реЗрдВ +++++[>+<тИТ]

 text segment ; bf4.asm assume cs:text, ds:data, ss:stk begin: ;   mov AX,data ;    mov DS,AX mov DL, str_arr ;   DL 1  mov CX, 50h ; 80  prev: cmp DL, 2Bh ;   + jne next ; ,    next mov BL, j ;   BL   inc data_arr[BX] ; ,      1 next: cmp DL, 2Dh ;   - jne next1 ; ,    next1 mov BL, j dec data_arr[BX] ;BX,   Bl next1: cmp DL, 3Eh ;   > jne next2 ; ,    next2 inc j ; ,      data_arr next2: cmp DL, 3Ch ;   < jne next3 ; ,    next3 dec j ; ,      data_arr next3: cmp DL, 2Eh ;   . jne next4 ; ,    next4 mov AH,2 ; ,    mov BL, j mov DL, data_arr[BX] int 21h next4: cmp DL, 5Bh ;   [ jne next5 ; ,    next5 mov BL, j mov DL, data_arr[BX] cmp DL, 00 ; ,    data_arr   jz next5 ;  ,   mov DL, i ;   mov i_stor, Dl ;  i_stor   i next5: cmp DL, 5Dh ;   ] jne next6 ; ,    next6 mov BL, j mov DL, data_arr[BX] cmp DL, 00 ; ,    data_arr   jz next6 ;  ,   mov DL, i_stor ;   mov i, Dl ;  i_stor   i next6: inc i ;     mov BL, i mov DL, str_arr[BX] loop prev ;    prev: mov AX, 4c00h ;   int 21h text ends data segment str_arr DB 2Bh,2Bh,2Bh,2Bh,5Bh, 3Eh,2Bh,3Ch,2Dh ,5Dh, '$' ;  ++++[>+<-] data_arr DB 0,0,0,0,0,0,0,0,0,0,'$' ;  i DB 0,'$' ;    j DB 0,'$' ;    i_stor DB 0,'$' data ends stk segment stack db 100h dup (0) ;  256  stk ends end begin 



рдЗрдирдкреБрдЯ рд▓рд╛рдЗрди 3fh рдЗрдВрдЯрд░рдкреНрдЯ 21h рдореЗрдВ рдлрд╝рдВрдХреНрд╢рди рдЬреЛрдбрд╝реЗрдВ
  mov ah, 3fh ;   mov cx, 100h ; 256  mov dx,OFFSET str_arr int 21h 


рд╣рдо рд╕реНрдЯреНрд░рд┐рдВрдЧ '$' рдХреЗ рдЕрдВрдд рддрдХ рдкрд╣реБрдБрдЪрдиреЗ рдХреЗ рдмрд╛рдж рд▓реВрдк рд╕реЗ рдмрд╛рд╣рд░ рдирд┐рдХрд▓реЗрдВрдЧреЗред
рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рд╡рд░реНрддрдорд╛рди рдЪрд░рд┐рддреНрд░ рдХреА рддреБрд▓рдирд╛ '$' рдЕрдХреНрд╖рд░ рд╕реЗ рдХрд░реЗрдВрдЧреЗ ред
 cmp DL, 24h ;  '$' je exit_loop 

рд▓реВрдк рд▓реВрдк рдХреЛ jmp рдХрдорд╛рдВрдб рд╕реЗ рдмрджрд▓реЗрдВред
 text segment assume cs:text,ds:data, ss: stk begin: ;   mov AX,data ;    mov DS,AX ;   mov ah, 3fh mov cx, 100h ; 256  mov dx,OFFSET str_arr int 21h ; mov DL, str_arr ;   DL 1  ;mov CX, 100h ; 256  prev: cmp DL, 24h ;    '$' je exit_loop cmp DL, 2Bh ;   + jne next ; ,    next mov BL, j ;   BL   inc data_arr[BX] ; ,      1 next: cmp DL, 2Dh ;   - jne next1 ; ,    next1 mov BL, j dec data_arr[BX] ;BX,   Bl next1: cmp DL, 3Eh ;   > jne next2 ; ,    next2 inc j ; ,      data_arr next2: cmp DL, 3Ch ;   < jne next3 ; ,    next3 dec j ; ,      data_arr next3: cmp DL, 2Eh ;   . jne next4 ; ,    next4 mov AH,2 ; ,    mov BL, j mov DL, data_arr[BX] int 21h next4: cmp DL, 5Bh ;   [ jne next5 ; ,    next5 mov BL, j mov DL, data_arr[BX] cmp DL, 00 ; ,    data_arr   jz next5 ;  ,   mov DL, i ;   mov i_stor, Dl ;  i_stor   i next5: cmp DL, 5Dh ;   ] jne next6 ; ,    next6 mov BL, j mov DL, data_arr[BX] cmp DL, 00 ; ,    data_arr   jz next6 ;  ,   mov DL, i_stor ;   mov i, Dl ;  i_stor   i ;       prev: next6: inc i ;     mov BL, i mov DL, str_arr[BX] ; loop prev ;    prev: jmp prev exit_loop: MOV AH,2 ;     MOV DL,0Ah INT 21h mov AX, 4c00h ;   int 21h text ends data segment str_arr DB 256h DUP('$') ;   256  data_arr DB 0,0,0,0,0,0,0,0,0,0,'$' ;  i DB 0,'$' ;    j DB 0,'$' ;    i_stor DB 0,'$' data ends stk segment para stack db 100h dup (0) ;  256  stk ends end begin 

рд╕рдВрдХрд▓рди рдХреЗ рджреМрд░рд╛рди рд╣рдореЗрдВ рдПрдХ рддреНрд░реБрдЯрд┐ рдорд┐рд▓рддреА рд╣реИ
0001h рдмрд╛рдЗрдЯреНрд╕ рдХреА рд╕реАрдорд╛ рд╕реЗ рдмрд╛рд╣рд░ рд╕рд╛рдкреЗрдХреНрд╖ рдХреВрдж

рддрдереНрдп рдпрд╣ рд╣реИ рдХрд┐ je / jne рдХрдорд╛рдВрдб рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреА рдХреБрдЫ рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреЗ рдмрд╛рдж рд╣реА рдХреВрдж рд╕рдХрддреЗ рд╣реИрдВ (рдкреНрд░рддреНрдпреЗрдХ рдкрдВрдХреНрддрд┐ рдореЗрдореЛрд░реА рдореЗрдВ 1 рд╕реЗ 5 рдмрд╛рдЗрдЯреНрд╕ рддрдХ рд▓реЗ рдЬрд╛рддреА рд╣реИ)ред


Je / jne рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЗ рдЕрдВрдд рдореЗрдВ рд▓рдВрдмреА рдЫрд▓рд╛рдВрдЧ рдирд╣реАрдВ рд▓рдЧрд╛рдИ рдЬрд╛ рд╕рдХрддреАред
рдЗрд╕рд▓рд┐рдП, рд╣рдо рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреА рдЬрдЧрд╣ рд▓реЗрддреЗ рд╣реИрдВ
  cmp DL, 24h ;  '$' je exit_loop ... exit_loop: 

рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐
 cmp DL, 24h ;  '$' jne exit_ jmp exit_loop exit_ ... exit_loop: 


рдЗрд╕рд▓рд┐рдП, рдпрджрд┐ рд╡рд░реНрддрдорд╛рди рд╡рд░реНрдг $ рд╕реЗ рдореЗрд▓ рдЦрд╛рддрд╛ рд╣реИ, рддреЛ exit_loop рдкрд░ рдЬрд╛рдПрдВ: jmp рдХрдорд╛рдВрдб рдХреЗ рд╕рд╛рде рд▓реЗрдмрд▓ рдХрд░реЗрдВ, рдЕрдиреНрдпрдерд╛ рд╣рдо jmp рдХрдорд╛рдВрдб рдкрд░ рдХреВрджрддреЗ рд╣реИрдВ ред
рдЬреЗрдПрдордкреА рдХрдорд╛рдВрдб рдЗрдВрдЯреНрд░рд╛-рд╕реЗрдЧрдореЗрдВрдЯ рд░рд┐рд▓реЗрдЯрд┐рд╡ рд╢реЙрд░реНрдЯ рдЯреНрд░рд╛рдВрдЬрд╝рд┐рд╢рди (рд╕рдВрдХреНрд░рдордг рдХреЛ 128 рдмрд╛рдЗрдЯреНрд╕ рд╕реЗ рдХрдо рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рдпрд╛рдиреА IP: = IP + i8) рдпрд╛ рдЗрдВрдЯреНрд░рд╛-рд╕реЗрдЧрдореЗрдВрдЯ рд░рд┐рд▓реЗрдЯрд┐рд╡ рд▓реЙрдиреНрдЧ рдЯреНрд░рд╛рдВрдЬрд╝рд┐рд╢рди (327 рдмрд╛рдЗрдЯреНрд╕ рд╕реЗ рдХрдо рд╕рдВрдХреНрд░рдордг, рдпрд╛рдиреА- IP = = IP + i16)ред
рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ, рдЬреЗрдПрдордкреА рдХрдорд╛рдВрдб рдПрдХ рд░рд┐рд╢реНрддреЗрджрд╛рд░ рд▓рдВрдмреА рдЫрд▓рд╛рдВрдЧ рд▓рдЧрд╛рддрд╛ рд╣реИ , рдЬреЛ рдХрд┐ рд╣рдореЗрдВ рдЪрд╛рд╣рд┐рдП (рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдЖрдк рдХреЗрд╡рд▓ рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреА рд╢реБрд░реБрдЖрдд рдХреЗ рдмрдЬрд╛рдп рдЬрдВрдк рдирд┐рд░реНрджреЗрд╢ рдХреЛ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ)ред
 ;jumps text segment assume cs:text,ds:data, ss: stk begin: ;   mov AX,data ;    mov DS,AX ;;; mov ah, 3fh ;   mov cx, 100h ; 256  mov dx,OFFSET str_arr int 21h ;;; mov DL, str_arr ;   DL 1  ;mov CX, 100h ; 256  prev: cmp DL, 24h ;  '$' ;je exit_loop jne l1 jmp SHORT exit_loop l1: cmp DL, 2Bh ;   + jne next ; ,    next mov BL, j ;   BL   inc data_arr[BX] ; ,      1 next: cmp DL, 2Dh ;   - jne next1 ; ,    next1 mov BL, j dec data_arr[BX] ;BX,   Bl next1: cmp DL, 3Eh ;   > jne next2 ; ,    next2 inc j ; ,      data_arr next2: cmp DL, 3Ch ;   < jne next3 ; ,    next3 dec j ; ,      data_arr next3: cmp DL, 2Eh ;   . jne next4 ; ,    next4 mov AH,2 ; ,    mov BL, j mov DL, data_arr[BX] int 21h next4: cmp DL, 5Bh ;   [ jne next5 ; ,    next5 mov BL, j mov DL, data_arr[BX] cmp DL, 00 ; ,    data_arr   jz next5 ;  ,   mov DL, i ;   mov i_stor, Dl ;  i_stor   i next5: cmp DL, 5Dh ;   ] jne next6 ; ,    next6 mov BL, j mov DL, data_arr[BX] cmp DL, 00 ; ,    data_arr   jz next6 ;  ,   mov DL, i_stor ;   mov i, Dl ;  i_stor   i ;       prev: next6: inc i ;     mov BL, i mov DL, str_arr[BX] ; loop prev ;    prev: jmp prev exit_loop: MOV AH,2 ;     MOV DL,0Ah INT 21h mov AX, 4c00h ;   int 21h text ends data segment str_arr DB 256h DUP('$') ;   256  data_arr DB 0,0,0,0,0,0,0,0,0,0,'$' ;  i DB 0,'$' ;    j DB 0,'$' ;    i_stor DB 0,'$' data ends stk segment para stack db 100h dup (0) ;  256  stk ends end begin 




рдХрд╛рд░реНрдпрдХреНрд░рдореЛрдВ рдХреА рд▓рд┐рд╕реНрдЯрд┐рдВрдЧ рдХреЗ рд╕рд╛рде рдЬреАрдердм рд╕реЗ рд▓рд┐рдВрдХ рдХрд░реЗрдВ ред

PS рдпрд╣рд╛рдБ рдПрдХ x86 рд░рд┐рд╡рд░реНрд╕ рдкреЛрд▓рд┐рд╢ рдиреЛрдЯреЗрд╢рди (RPN) рдХреИрд▓рдХреБрд▓реЗрдЯрд░ рдмрдирд╛рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдПрдХ рд▓реЗрдЦ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ ред

Source: https://habr.com/ru/post/hi423121/


All Articles