低级Brainfuck。 续...

第一部分
第二部分
第三部分

在TurboAssembler'e上创建了一个令人难以置信的语言翻译器。

data_arr数组(图灵机的“磁带”)的输出添加到屏幕。

让我们编写一个程序,该程序通过09h中断函数21h显示任意数组的元素

.model tiny ; ascii-decoder.asm jumps .data data_arr DB 1,0,2,0,3,0,4,0,5,0,6,0,7,'$' ;  .code ORG 100h start: ;   mov AX, @data ;    mov DS,AX ;;;;;;;;;;;;;;;; MOV AH,2 ;     MOV DL,0Ah INT 21h mov dx,offset data_arr ;     mov ah,09h ;   int 21h ;;;;;;;;;; MOV AH,2 ;     MOV DL,0Ah INT 21h mov AX, 4c00h ;   int 21h end start 

在屏幕上,我们将看到data_arr DB数组1,0,2,0,3,0,4,0,5,0,6,0,7,'$'的元素的ascii码



为了将数组的元素表示为数字,我们将使用div运算符。

div命令NUMBER将寄存器AX除以NUMBER ,并将除法的整数部分放在AL中 ,而除法的其余部分放在AH中NUMBER可以是存储区或通用寄存器)

打印数组的第一个和第二个元素

 .model tiny ; ascii-decoder.asm jumps .data data_arr DB 10,12,0,0,0,0,0,0,0,0,'$' ;  .code ORG 100h start: ;   mov AX, @data ;    mov DS,AX ;;;;;;;;;;;;;;;; MOV AH,2 ;     MOV DL,0Ah INT 21h ;mov dx,offset data_arr ;     ;mov ah,09h ;   ;int 21h ;;   sub AH, AH ;  AH mov AL, data_arr ;  mov BL, 10 ;  div BL ;   AL=,  AH= mov BX,AX add BX,3030h mov AH,2 ;     21h mov DL,BL ;    int 21h mov DL, BH ;    int 21h ;   sub AH, AH ;  AH mov AL, data_arr+1 ;  mov BL, 10 ;  div BL ;   AL=,  AH= mov BX,AX add BX,3030h mov AH,2 ;     21h mov DL,BL ;    int 21h mov DL, BH ;    int 21h ;;;;;;;;;; MOV AH,2 ;     MOV DL,0Ah INT 21h mov AX, 4c00h ;   int 21h end start 

为了显示数组的所有元素,我们将使用loop命令。
我们将等于数组中元素数量的小节数放入CX寄存器中,并且在每一个小节上,我们将对数组i的索引加一。

 .model tiny ; ascii-decoder1.asm jumps .data data_arr DB 3,5,6,7,0,11,12,13,0,20,'$' ;  i DB 0,'$' .code ORG 100h start: ;   mov AX, @data ;    mov DS,AX ;;;;;;;;;;;;;;;; MOV AH,2 ;     MOV DL,0Ah INT 21h ;mov dx,offset data_arr ;     ;mov ah,09h ;   ;int 21h mov CX, 0Ah _prev: ;;  ; mov BL,i sub AH, AH ;  AH mov AL, data_arr[BX] ;  mov BL, 10 ;  div BL ;   AL=,  AH= mov BX,AX add BX,3030h mov AH,2 ;     21h mov DL,BL ;    int 21h mov DL, BH ;    int 21h ;    sub DL, DL int 21h ;;; sub BX,BX inc i ;   mov BL, i loop _prev ;;;;;;;;;; MOV AH,2 ;     MOV DL,0Ah INT 21h mov AX, 4c00h ;   int 21h end start 

接下来,添加一个循环,在主程序中将数组的元素显示为数字。

 .model tiny jumps .data str_arr DB 256h DUP('$') data_arr DB 0,0,0,0,0,0,0,0,0,0,'$' i DB 0,'$' j DB 0,'$' i_stor DB 0,'$' .code ORG 100h start: mov AX, @data mov DS,AX ;;; mov ah, 3fh mov cx, 100h mov dx,OFFSET str_arr int 21h ;;; mov DL, str_arr prev: cmp DL, 24h je exit_loop cmp DL, 2Bh jne next mov BL, j inc data_arr[BX] next: cmp DL, 2Dh jne next1 mov BL, j dec data_arr[BX] next1: cmp DL, 3Eh jne next2 inc j next2: cmp DL, 3Ch jne next3 dec j next3: cmp DL, 2Eh jne next4 mov AH,2 mov BL, j mov DL, data_arr[BX] int 21h next4: cmp DL, 5Bh jne next5 ;mov BL, j ;mov DL, data_arr[BX] ;cmp DL, 00 ;jz next5 mov DL, i mov i_stor, Dl next5: cmp DL, 5Dh jne next6 mov BL, j mov DL, data_arr[BX] cmp DL, 00 jz next6 mov DL, i_stor mov i, DL next6: inc i mov BL, i mov DL, str_arr[BX] ; loop prev jmp prev exit_loop: ;;;;;;;;;;;;;;;; MOV AH,2 ;   MOV DL,0Ah ;   INT 21h ;   ; output data_arr mov CX, 0Ah ; 10  sub AL,AL ;  AL mov i, AL ;   sub BX,BX ;  BX _prev: ; incorrect 1st element sub AH, AH ;  AH mov AL, data_arr[BX] ;  ;mov AL, data_arr+1 mov BL, 10 ;  div BL ;  AL=  AH= mov BX,AX add BX,3030h mov AH,2 ;   2  21h mov DL,BL ;   int 21h mov DL, BH ;   int 21h ;   ( ) sub DL, DL int 21h ;;; sub BX,BX inc i ;    mov BL, i loop _prev ;;;;;;;;;; MOV AH,2 ;   MOV DL,0Ah ;   INT 21h ;   mov AX, 4c00h ;   int 21h end start 

HelloWorld现在看起来像这样



由于我们不处理大于99的数字,因此数字100显示不正确,其余数字则正确显示。

嵌套括号


要处理嵌套的括号,我们将把开括号放在堆栈上,将闭括号放在堆栈上。

我们将编写一个用于在Pascal中使用堆栈的简单程序。

 var a : array[1..10] of integer; size : integer; procedure push(c : integer); begin size := size + 1; a[size] := c; end; procedure pop; begin size := size - 1; end; begin size := 0; Push(1); writeln(a[size]); Push(2); writeln(a[size]); Push(3); writeln(a[size]); Pop(); writeln(a[size]); Pop(); writeln(a[size]); end. 

从这里

您可以在这里这里检查。

更改推送过程,以便当大小为零时,我们获得到第一个元素的链接。

 procedure push(c : integer); begin a[size+1] := c; size := size + 1; end; 

在主程序中添加一个“堆栈”。

 Program bf5_stack; LABEL prev,next; var a : array[1..10] of integer; size : integer; data_arr:array[1..10] of integer; //   str_arr: string; //  i,j,k: integer; //     i_stor: integer; //Stack procedure push(c : integer); begin a[size+1] := c; size := size + 1; end; procedure pop; begin size := size - 1; end; {---------------------------------------------------} begin j:=1; //       i:=1; size := 0; {  } //readln(str_arr); //  //str_arr:='+++[>+++[>+<-]<-]'; // 3*3=9 str_arr:='+++[> +++[>+++[>+<-]<-] <-]'; //3^3=27; 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 Push(i); if (str_arr[i]=']') then begin Pop(); if (data_arr[j]>0) then begin i := a[size+1]; goto prev; end; end; i:=i+1; goto prev; next: for k:=1 to 10 do begin write(data_arr[k]); write(' '); end; end. 

ideone.com
如果遇到开括号,则只需将其地址放在堆栈中,当遇到闭括号时,便从堆栈中提取其地址,如果当前单元格中的值大于零,则返回到开括号。

bf51_stack.pas程序中显示了使用普通/“标准”堆栈的示例。

将堆栈“添加”到主汇编程序

 .model tiny ; bf7_stack_decoder.asm jumps .data 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,'$' .code ORG 100h start: ;   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 ;sub DX,DX mov AL, i ;   push AX next5: cmp DL, 5Dh ;   ] jne next6 ; ,    next6 sub AX,AX pop AX mov BL, j mov DL, data_arr[BX] cmp DL, 00 ; ,    data_arr   jz next6 ;  ,   mov i, AL ;  i_stor   i mov BL, i mov DL, str_arr[BX] jmp prev next6: inc i ;     mov BL, i mov DL, str_arr[BX] jmp prev exit_loop: ; ascii-  MOV AH,2 ;   MOV DL,0Ah ;   INT 21h ;   ; output data_arr mov CX, 0Ah ; 10  sub AL,AL ;  AL mov i, AL ;   sub BX,BX ;  BX _prev: ; incorrect 1st element sub AH, AH ;  AH mov AL, data_arr[BX] ;  ;mov AL, data_arr+1 mov BL, 10 ;  div BL ;  AL=  AH= mov BX,AX add BX,3030h mov AH,2 ;   2  21h mov DL,BL ;   int 21h mov DL, BH ;   int 21h ;   ( ) sub DL, DL int 21h ;;; sub BX,BX inc i ;    mov BL, i loop _prev ;;;;;;;;;; MOV AH,2 ;   MOV DL,0Ah ;   INT 21h ;   ;;;;;;;;;;;;;;; mov AX, 4c00h ;   int 21h END start 



链接到github。

Source: https://habr.com/ru/post/zh-CN426649/


All Articles