Well, reducing it to "string manipulation" might fall short, as there is no similarity to the usual string manipulation languages. It's a rather full figured imperative programming language. Programs get executed when 'assembled'. It provides typed typed global and local variables (Boolbool, Integerinteger, Stringstring), arrays (depending on assembler version) and more.
Not just 'sllightly''slightly' higher.
For structured programming (which ofc includes calligncalling conventions and data structures) this has already be kind of answered in a question about stacks on stackless machines:
While the mentioned COLUMBUS Assembler (*1) package was AFAIK a Siemens specific development, it was 100% F-Assembler macro code. In addition the the macro librarylibraries there were as well listing formatersformatters that turned a straight Assemblerassembler listing into an intended or Nassi/Shneiderman listings.
BesideBesides that, projects/companies of course did build macro packages to enable easy handling of more complex issues. Plus, of course, every OS did supply macros for whatever services they had as well.
Well, I do still have somewhere a tape with several versions (we did modify it quite a lot from it'sits original version). In addition I did port it a long time ago to ORCA/M for the Apple II. Just, finding either may take some time.
D/E/F-Assembler (and it'sits macro language) was published short after the /360 was introduced with F being the 'full' version, but also commingcoming with a huge RAM requirement of 64 KiB :)) So this is most likely the base for your package.