From 72d9bbcc3154142af79fb686d9dc7e4d1fa1badb Mon Sep 17 00:00:00 2001 From: dtrendafilov Date: Thu, 29 Nov 2018 09:13:12 +0200 Subject: Feature/strings (#75) * The assembler supports string opcode * disabled the string test until implmented * strings can be printed --- spasm/src/asm/assembler.cpp | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) (limited to 'spasm/src/asm/assembler.cpp') diff --git a/spasm/src/asm/assembler.cpp b/spasm/src/asm/assembler.cpp index fadd747..1f69b1a 100644 --- a/spasm/src/asm/assembler.cpp +++ b/spasm/src/asm/assembler.cpp @@ -55,6 +55,23 @@ int get_arg_size(const Lexer::Token args[]) size = std::max(size, 3); break; } + case Lexer::Token::StringValue: + { + const auto length = args[i].value_str().size(); + if (length > 0xffffffff) + { + size = std::max(size, 3); + } + else if (length > 0xffff) + { + size = std::max(size, 2); + } + else if (length > 0xff) + { + size = std::max(size, 1); + } + break; + } default: break; } @@ -125,6 +142,12 @@ void Assembler::assemble() assert(args[1].type() == Lexer::Token::Ident); assemble_identifier(args[1]); } + else if (type == Lexer::Token::String) + { + assert(args[1].type() == Lexer::Token::StringValue); + const auto& s = args[1].value_str(); + _bytecode->push_string(s.data(), s.size(), arg_size); + } else { if (args[1].type() == Lexer::Token::Integer) -- cgit v1.3.1-23-gd82d