概要
blocklyでfasm(アセンブラ)プログラミング、やってみた。
問題は、AtCoder ABC 081 A - Placing Marbles
文字列を受け取り、1の個数をカウントする問題です。
写真
生成したアセンブラ
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;
};
成果物
以上。
