0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

blocklyでfasm(アセンブラ)プログラミング

0
Last updated at Posted at 2026-05-21

概要

blocklyでfasm(アセンブラ)プログラミング、やってみた。
問題は、AtCoder ABC 081 A - Placing Marbles
文字列を受け取り、1の個数をカウントする問題です。

写真

image.png

生成したアセンブラ

format PE64 console
entry start
include 'C:\Program Files (x86)\fasmw17334\INCLUDE\win64a.inc'

section '.idata' import data readable writeable
	library kernel32, 'kernel32.dll', msvcrt, 'MSVCRT.DLL'
	import kernel32, ExitProcess, 'ExitProcess'
	import msvcrt, printf, 'printf', scanf, 'scanf'

section '.data' data readable
	fmti	db  '%s', 0
	fmto	db  '%d', 10, 0

section '.bss' data readable writeable
	buff	rq  64

section '.text' code readable executable
start:
	sub		rsp, 32
	cinvoke scanf, fmti, buff
	lea		r13, [buff]
	xor		rbx, rbx
_loop0:
	mov		al, [r13]
	test	al, al
	jz		_loop2
	cmp		al, '1'
	jne		_loop1
	inc		rbx
_loop1:
	inc		r13
	jmp		_loop0
_loop2:
	cinvoke printf, fmto, rbx
	cinvoke ExitProcess, 0




実行結果

>fasm blockly.asm
flat assembler  version 1.73.34  (1048576 kilobytes memory)
4 passes, 2560 bytes.

>blockly
111
3

サンプルコード



Blockly.Blocks['mov'] = {
  init: function() {
    this.appendDummyInput()
		    .appendField("mov")
        .appendField(new Blockly.FieldTextInput("al, [r13]"), "regs");
    this.setPreviousStatement(true, null);
		this.setNextStatement(true, null);
    this.setColour(150);
 		this.setTooltip('');
 		this.setHelpUrl('');
  }
};
javascript.javascriptGenerator.forBlock['mov'] = function(block, generator) {
      var regs = block.getFieldValue('regs');
      var code = "\tmov\t" + regs + "\n";
      return code;
  };


Blockly.Blocks['lea'] = {
  init: function() {
    this.appendDummyInput()
		    .appendField("lea")
        .appendField(new Blockly.FieldTextInput("r13, [buff]"), "regs");
    this.setPreviousStatement(true, null);
		this.setNextStatement(true, null);
    this.setColour(150);
 		this.setTooltip('');
 		this.setHelpUrl('');
  }
};
javascript.javascriptGenerator.forBlock['lea'] = function(block, generator) {
      var regs = block.getFieldValue('regs');
      var code = "\tlea\t" + regs + "\n";
      return code;
  };


Blockly.Blocks['sub'] = {
  init: function() {
    this.appendDummyInput()
		    .appendField("sub")
        .appendField(new Blockly.FieldTextInput("rsp, 32"), "regs");
    this.setPreviousStatement(true, null);
		this.setNextStatement(true, null);
    this.setColour(150);
 		this.setTooltip('');
 		this.setHelpUrl('');
  }
};
javascript.javascriptGenerator.forBlock['sub'] = function(block, generator) {
      var regs = block.getFieldValue('regs');
      var code = "\tsub\t" + regs + "\n";
      return code;
  };


Blockly.Blocks['xor'] = {
  init: function() {
    this.appendDummyInput()
		    .appendField("xor")
        .appendField(new Blockly.FieldTextInput("rbx, rbx"), "regs");
    this.setPreviousStatement(true, null);
		this.setNextStatement(true, null);
    this.setColour(150);
 		this.setTooltip('');
 		this.setHelpUrl('');
  }
};
javascript.javascriptGenerator.forBlock['xor'] = function(block, generator) {
      var regs = block.getFieldValue('regs');
      var code = "\txor\t" + regs + "\n";
      return code;
  };

Blockly.Blocks['scanf'] = {
  init: function() {
    this.appendDummyInput()
		    .appendField("scanf")
        .appendField(new Blockly.FieldTextInput("fmti, buff"), "regs");
    this.setPreviousStatement(true, null);
		this.setNextStatement(true, null);
    this.setColour(5);
 		this.setTooltip('');
 		this.setHelpUrl('');
  }
};
javascript.javascriptGenerator.forBlock['scanf'] = function(block, generator) {
      var regs = block.getFieldValue('regs');
      var code = "\tcinvoke scanf, " + regs + "\n";
      return code;
  };

Blockly.Blocks['printf'] = {
  init: function() {
    this.appendDummyInput()
		    .appendField("printf")
        .appendField(new Blockly.FieldTextInput("fmto, rbx"), "regs");
    this.setPreviousStatement(true, null);
		this.setNextStatement(true, null);
    this.setColour(5);
 		this.setTooltip('');
 		this.setHelpUrl('');
  }
};
javascript.javascriptGenerator.forBlock['printf'] = function(block, generator) {
      var regs = block.getFieldValue('regs');
      var code = "\tcinvoke printf, " + regs + "\n";
      return code;
  };


Blockly.Blocks['inc'] = {
  init: function() {
    this.appendDummyInput()
		    .appendField("inc")
        .appendField(new Blockly.FieldTextInput("rbx"), "regs");
    this.setPreviousStatement(true, null);
		this.setNextStatement(true, null);
    this.setColour(150);
 		this.setTooltip('');
 		this.setHelpUrl('');
  }
};
javascript.javascriptGenerator.forBlock['inc'] = function(block, generator) {
      var regs = block.getFieldValue('regs');
      var code = "\tinc\t" + regs + "\n";
      return code;
  };

Blockly.Blocks['inc'] = {
  init: function() {
    this.appendDummyInput()
		    .appendField("inc")
        .appendField(new Blockly.FieldTextInput("rbx"), "regs");
    this.setPreviousStatement(true, null);
		this.setNextStatement(true, null);
    this.setColour(150);
 		this.setTooltip('');
 		this.setHelpUrl('');
  }
};
javascript.javascriptGenerator.forBlock['inc'] = function(block, generator) {
      var regs = block.getFieldValue('regs');
      var code = "\tinc\t" + regs + "\n";
      return code;
  };

Blockly.Blocks['test'] = {
  init: function() {
    this.appendDummyInput()
		    .appendField("test")
        .appendField(new Blockly.FieldTextInput("al, al"), "regs");
    this.setPreviousStatement(true, null);
		this.setNextStatement(true, null);
    this.setColour(230);
 		this.setTooltip('');
 		this.setHelpUrl('');
  }
};
javascript.javascriptGenerator.forBlock['test'] = function(block, generator) {
      var regs = block.getFieldValue('regs');
      var code = "\ttest\t" + regs + "\n";
      return code;
  };

Blockly.Blocks['cmp'] = {
  init: function() {
    this.appendDummyInput()
		    .appendField("cmp")
        .appendField(new Blockly.FieldTextInput("al, '1'"), "regs");
    this.setPreviousStatement(true, null);
		this.setNextStatement(true, null);
    this.setColour(230);
 		this.setTooltip('');
 		this.setHelpUrl('');
  }
};
javascript.javascriptGenerator.forBlock['cmp'] = function(block, generator) {
      var regs = block.getFieldValue('regs');
      var code = "\tcmp\t" + regs + "\n";
      return code;
  };

Blockly.Blocks['jmp'] = {
  init: function() {
    this.appendDummyInput()
		    .appendField("jmp")
        .appendField(new Blockly.FieldTextInput("loop"), "regs");
    this.setPreviousStatement(true, null);
		this.setNextStatement(true, null);
    this.setColour(25);
 		this.setTooltip('');
 		this.setHelpUrl('');
  }
};
javascript.javascriptGenerator.forBlock['jmp'] = function(block, generator) {
      var regs = block.getFieldValue('regs');
      var code = "\tjmp\t" + regs + "\n";
      return code;
  };

Blockly.Blocks['jz'] = {
  init: function() {
    this.appendDummyInput()
		    .appendField("jz")
        .appendField(new Blockly.FieldTextInput("loop"), "regs");
    this.setPreviousStatement(true, null);
		this.setNextStatement(true, null);
    this.setColour(25);
 		this.setTooltip('');
 		this.setHelpUrl('');
  }
};
javascript.javascriptGenerator.forBlock['jz'] = function(block, generator) {
      var regs = block.getFieldValue('regs');
      var code = "\tjz\t" + regs + "\n";
      return code;
  };

Blockly.Blocks['jne'] = {
  init: function() {
    this.appendDummyInput()
		    .appendField("jne")
        .appendField(new Blockly.FieldTextInput("loop"), "regs");
    this.setPreviousStatement(true, null);
		this.setNextStatement(true, null);
    this.setColour(25);
 		this.setTooltip('');
 		this.setHelpUrl('');
  }
};
javascript.javascriptGenerator.forBlock['jne'] = function(block, generator) {
      var regs = block.getFieldValue('regs');
      var code = "\tjne\t" + regs + "\n";
      return code;
  };


Blockly.Blocks['label'] = {
  init: function() {
    this.appendDummyInput()
		    .appendField("label")
        .appendField(new Blockly.FieldTextInput("loop"), "regs")
		    .appendField(":       ");
    this.setPreviousStatement(true, null);
		this.setNextStatement(true, null);
    this.setColour(0);
 		this.setTooltip('');
 		this.setHelpUrl('');
  }
};
javascript.javascriptGenerator.forBlock['label'] = function(block, generator) {
      var regs = block.getFieldValue('regs');
      var code = regs + ":\n";
      return code;
  };


成果物

以上。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?