https://git.reactos.org/?p=reactos.git;a=commitdiff;h=2245dd78f5c75dbbefdd7e926ce90033d67dee2d

commit 2245dd78f5c75dbbefdd7e926ce90033d67dee2d
Author:     Timo Kreuzer <[email protected]>
AuthorDate: Sat Oct 28 18:52:48 2023 +0300
Commit:     Timo Kreuzer <[email protected]>
CommitDate: Fri Nov 10 19:20:24 2023 +0200

    [ASMPP] Improve handling of rip relative addressing
---
 sdk/tools/asmpp/asmpp.cpp | 80 ++++++++++++++++++++++++++++++++++++++++++-----
 1 file changed, 72 insertions(+), 8 deletions(-)

diff --git a/sdk/tools/asmpp/asmpp.cpp b/sdk/tools/asmpp/asmpp.cpp
index 39f7bdbfc70..32b8a09c088 100644
--- a/sdk/tools/asmpp/asmpp.cpp
+++ b/sdk/tools/asmpp/asmpp.cpp
@@ -296,27 +296,54 @@ vector<TOKEN_DEF> g_TokenList =
 // FIXME: use context?
 unsigned int g_label_number = 0;
 
-vector<string> g_identifiers;
+bool g_processing_jmp = false;
+
+enum class IDTYPE
+{
+    Memory,
+    Register,
+    Label,
+    Constant,
+    Macro,
+    Instruction,
+    String,
+    Unknown
+};
+
+struct IDENTIFIER
+{
+    string Name;
+    IDTYPE Type;
+};
+
+vector<IDENTIFIER> g_identifiers;
+
+static
+void
+add_identifier(Token& tok, IDTYPE type)
+{
+    g_identifiers.push_back(IDENTIFIER{ tok.str(), type });
+    //fprintf(stderr, "Added id: '%s'\n", tok.str().c_str());
+}
 
 void
 add_mem_id(Token& tok)
 {
-    g_identifiers.push_back(tok.str());
-    //fprintf(stderr, "Added mem id: '%s'\n", tok.str().c_str());
+    add_identifier(tok, IDTYPE::Memory);
 }
 
 bool
 is_mem_id(Token& tok)
 {
-    for (auto id : g_identifiers)
+    for (IDENTIFIER& identifier : g_identifiers)
     {
-        if (id == tok.str())
+        if (identifier.Name == tok.str())
         {
-            return true;
+            return identifier.Type == IDTYPE::Memory;
         }
     }
 
-    return false;
+    return true;
 }
 
 bool
@@ -587,10 +614,13 @@ size_t translate_instruction_param(TokenList& tokens, 
size_t index, const vector
             case TOKEN_TYPE::Operator:
                 if (tok.str() == ",")
                     return index;
+                return translate_token(tokens, index, macro_params);
 
             case TOKEN_TYPE::Identifier:
                 index = translate_token(tokens, index, macro_params);
-                if (is_mem_id(tok))
+                if (is_mem_id(tok) &&
+                    !is_string_in_list(macro_params, tok.str()) &&
+                    !g_processing_jmp)
                 {
                     printf("[rip]");
                 }
@@ -604,8 +634,36 @@ size_t translate_instruction_param(TokenList& tokens, 
size_t index, const vector
     return index;
 }
 
+static
+bool
+is_jmp_or_call(const Token& tok)
+{
+    const char* inst_list[] = {
+        "jmp", "call", "ja", "jae", "jb", "jbe", "jc", "jcxz", "je", "jecxz", 
"jg", "jge",
+        "jl", "jle", "jna", "jnae", "jnb", "jnbe", "jnc", "jne", "jng", 
"jnge", "jnl", "jnle",
+        "jno", "jnp", "jns", "jnz", "jo", "jp", "jpe", "jpo", "jrcxz", "js", 
"jz", "loop", "loope",
+        "loopne", "loopnz", "loopz"
+    };
+
+    for (const char* inst : inst_list)
+    {
+        if (iequals(tok.str(), inst))
+        {
+            return true;
+        }
+    }
+
+    return false;
+}
+
 size_t translate_instruction(TokenList& tokens, size_t index, const 
vector<string>& macro_params)
 {
+    // Check for jump/call instructions
+    if (is_jmp_or_call(tokens[index]))
+    {
+        g_processing_jmp = true;
+    }
+
     // Translate the instruction itself
     index = translate_token(tokens, index, macro_params);
 
@@ -624,6 +682,7 @@ size_t translate_instruction(TokenList& tokens, size_t 
index, const vector<strin
         {
             case TOKEN_TYPE::Comment:
             case TOKEN_TYPE::NewLine:
+                g_processing_jmp = false;
                 return index;
 
             case TOKEN_TYPE::WhiteSpace:
@@ -637,6 +696,7 @@ size_t translate_instruction(TokenList& tokens, size_t 
index, const vector<strin
         }
     }
 
+    g_processing_jmp = false;
     return index;
 }
 
@@ -891,6 +951,7 @@ translate_identifier_construct(TokenList& tokens, size_t 
index, const vector<str
         {
             printf("%s:", tok.str().c_str());
         }
+        add_identifier(tok, IDTYPE::Label);
         return index + 2;
     }
 
@@ -912,6 +973,7 @@ translate_identifier_construct(TokenList& tokens, size_t 
index, const vector<str
         case TOKEN_TYPE::KW_EQU:
             //printf("%s%s", tok.str().c_str(), tok1.str().c_str());
             printf("#define %s ", tok.str().c_str());
+            add_identifier(tok, IDTYPE::Constant);
             return translate_expression(tokens, index + 3, macro_params);
 
         case TOKEN_TYPE::KW_TEXTEQU:
@@ -921,6 +983,7 @@ translate_identifier_construct(TokenList& tokens, size_t 
index, const vector<str
 
             string textdef = tok4.str();
             printf("#define %s %s", tok.str().c_str(), textdef.substr(1, 
textdef.size() - 2).c_str());
+            add_identifier(tok, IDTYPE::Constant);
             return index + 5;
         }
 
@@ -940,6 +1003,7 @@ translate_identifier_construct(TokenList& tokens, size_t 
index, const vector<str
 #endif
                 index += 2;
             }
+            add_identifier(tok, IDTYPE::Label);
             break;
         }
 

Reply via email to