Page 2 of 2

Re: Prototyping ASM in a higher level language

Posted: Sun Sep 05, 2021 2:46 am
by moonchild
eekee wrote: C has goto. :) It can't jump out of a function
Sure it can! longjmp is there, just waiting to be (ab)used!

Re: Prototyping ASM in a higher level language

Posted: Tue Sep 07, 2021 4:43 am
by eekee
moonchild wrote:
eekee wrote: C has goto. :) It can't jump out of a function
Sure it can! longjmp is there, just waiting to be (ab)used!
:lol: Yeah, "[C] does not prevent you doing stupid things because that would also prevent you doing clever things."

Isn't it curious how easy it is to forget C has goto, even when you know about longjmp?

Re: Prototyping ASM in a higher level language

Posted: Wed Sep 08, 2021 2:21 am
by Wukl
eekee wrote: Isn't it curious how easy it is to forget C has goto, even when you know about longjmp?
Reminds me of Longjmp - FOR SPEED!!!.

More on-topic: in the computer organization course that I TA, we encourage to initially "play compiler" to learn common control flow patterns. We even specifically ask them to implement a recursive function in Java first, also because this may be the first time they encounter recursion as a concept.

But after that they should just write assembly straight from the specification. If they want to implement more complex algorithms such as sorting, we'd rather have them implement it from pseudo-code rather than translating each statement and expression from C. The goal of the course is to get the students to think in assembly, not C or Java.

I'd say building an OS in assembly has the same kind of goal. If you'd rather build a working OS, use a "higher-level language" (C, maybe C++, Rust and so on, but not Lua). The best way to learn assembly is by just writing assembly. Preferably first in a well-supported environment, where you have a C library to fall back on and a debugger to single-step through your code. And it doesn't have to be perfect -- my sorting algorithm turned out to have a runtime complexity of O(n² log n), but it usually sorted fewer than 25 items so it was good enough.

Re: Prototyping ASM in a higher level language

Posted: Wed Sep 08, 2021 10:35 am
by JohnpaulTH
Wukl wrote: But after that they should just write assembly straight from the specification. If they want to implement more complex algorithms such as sorting, we'd rather have them implement it from pseudo-code rather than translating each statement and expression from C. The goal of the course is to get the students to think in assembly, not C or Java.
Gracious! I would not want to think in Java! Seriously though, I think there is a lot of wisdom in this. I am not writing an operating system because I want to make the next fully featured Operating system that supports all hardware and emulates all computers hitherto. I want something more like DOS, but with less functionality. A hobby OS where everything is exactly like I want it. I also want to gain understanding about how computers work, and I have gained a lot of that. It is all about control for me, and assembly gives me the most control.

Re: Prototyping ASM in a higher level language

Posted: Thu Sep 09, 2021 4:35 am
by eekee
@JohnpaulTH: Your goals aren't very different to mine. (I'm also planning a novel UI, but that could be a separate project.) I also wanted control and simplicity, but as I struggled with assembly, I realised it would help if I made and stuck to a standard for subroutine calls; a simple ABI. Knowing a bit about Forth, I know a Forth compiler can be made as if it were just one step up from a macroassembler. Preferring Forth's ultrasimple design over the peculiarities and relative limitations of Nasm's syntax and macro system, I switched to Forth. I don't think I've lost any worthwhile control, or rather I will have more than enough control when I write my Forth compiler. However, despite its simplicity, I'm finding writing the compiler both tough and boring, so I keep getting distracted by more fun things.

Re: Prototyping ASM in a higher level language

Posted: Fri Sep 10, 2021 3:04 am
by Wukl
JohnpaulTH wrote:Gracious! I would not want to think in Java!
Very! Especially considering that they will use Java for most of the CS program. :lol:
JohnpaulTH wrote:I am not writing an operating system because I want to make the next fully featured Operating system that supports all hardware and emulates all computers hitherto. I want something more like DOS, but with less functionality. A hobby OS where everything is exactly like I want it. I also want to gain understanding about how computers work, and I have gained a lot of that. It is all about control for me, and assembly gives me the most control.
Awesome, that's how I started as well. Have fun :)

Re: Prototyping ASM in a higher level language

Posted: Fri Sep 10, 2021 5:00 am
by iansjack
JohnpaulTH wrote:
Wukl wrote:It is all about control for me, and assembly gives me the most control.
That's really not true - at least not in the sense that you need to write the whole OS in assembler. The most control is obtained by using the appropriate language for the situation. So you write those (very few) parts of the system where low-level control is needed in assembler. The rest you write in a far more organised language, such as C, which will make the code clearer, easier to maintain, and almost certainly more efficient.

IMO, one of the biggest mistakes a beginner can make is to restrict themselves to assembler. An experienced assembler programmer, with extensive knowledge of algorithms, data structures, and how to implement them, may be able to write an entire OS in assembler. But mere mortals, like most of us, are setting ourselves up for failure in imposing this totally artificial limitation.

Re: Prototyping ASM in a higher level language

Posted: Fri Sep 10, 2021 9:41 am
by JohnpaulTH
iansjack wrote:That's really not true - at least not in the sense that you need to write the whole OS in assembler.
I don't need to write it all in assembler to get the most control, but given how simple and low level my OS is, there is hardly anything that I wouldn't lose control over to some degree. I am interested in higher-level languages for writing programs, but building a compiler targetting my operating system is a large project in itself. So I would be expending a lot of energy to create something I would use for about 25% of the OS, when I could gain mastery of assembly in the same or shorter amount of time.

Re: Prototyping ASM in a higher level language

Posted: Fri Sep 10, 2021 9:59 am
by iansjack
You don't need to write a C compiler that runs on your OS, any more than you need to write an assembler. (Not a trivial task, especially as you are limiting yourself to assembler.)

If you just want to learn assembly language then fair enough (although I would say that writing an OS is the very worst way of learning assembly language). But it's your project, and you know what you want to get out of it, so good luck with it. I just want to point out to other beginners that they should think very carefully before restricting themselves to assembly language. It seems obvious that this will lead to the most efficient OS, but in practice it almost certainly leads to a limited, buggy, inefficient result. (Unless you are an expert assembly language programmer.)

Re: Prototyping ASM in a higher level language

Posted: Sat Sep 11, 2021 1:08 am
by eekee
eekee wrote:Forth Forth Forth
And now I'm thinking of using a web server written entirely in assembly language. :mrgreen: It's rwasa. I'm not sure though. Its benchmark graphs look a bit suspicious, does "12b" mean 12 bytes? I suppose so, because one graph has "128kb". 12 bytes is too small even for HEAD requests, but rwasa's performance falls behind on the 128"kb" test. There is one thing I really don't like about it. I'm glad I spotted this in the documentation: "Due to the lack of verbosity with rwasa for configuration issues, often the easiest way to locate errors is with strace." I could link the associated library for amd64 assembly coders, but would anyone want a library under the GPLv3, not even LGPL? Anyway, it's here.

But anyway, on topic, I'm restarting my Forth compiler and this time, I'm prototyping it in Forth for conversion to assembly. I don't expect the complete Forth code to run, but I do want to test components. Looking at the last attempt, I remember the problem wasn't just boredom. I was uncertain of some design details, developing it under DOS with an 80x25 screen didn't help, and I was coding for real mode which is not what I really want; I'd have to do it all again. This time, I'm working on Win10, targetting amd64 and Win10 to get started.

Re: Prototyping ASM in a higher level language

Posted: Thu Sep 30, 2021 6:21 pm
by Thomas
Hi JohnpaulTH,
See:
https://holub.com/compiler/
to get an idea how you would do an assembler like emulation in a high level language ( C ). The intermediate code section of this book would be useful.
The book is a tome. Section 6.2 is what I would encourage you to read for your purposes. This is for C, but you could do the same in Lua with a bit of imagination.

--Thomas