Catch up on stories from the past week (and beyond) at the Slashdot story archive


Forgot your password?
Programming Software

x86 Assembler JWASM Hits Stable Release 209

Odoital writes "January 2010 is an exciting month for x86 assembly language developers. Software developer Andreas Grech, better known to the x86 assembly language community and the rest of the world by his handle "japheth," has released another version of JWASM — a steadily growing fork of the Open Watcom (WASM) assembler. The main benefit of JWASM, arguably, is the nearly full support of Microsoft's Macro Assembler (MASM) syntax. As those in the assembly language community may already know, Microsoft's desire to continually support the development of MASM has been dwindling over the years — if only measurable by a decreasing lack of interest, updates and bug fixes — and thus the future of MASM remains uncertain. While Intel-style syntax x86 assemblers such as NASM have been around for a while, JWASM opens up a new possibility to those familiar with MASM-style syntax to develop in the domains (i.e. other than Windows) in which assemblers such as NASM currently thrive. JWASM is a welcomed tool that supplements the entire x86 assembly language community and will hopefully, in time, generate new low-level interests and solutions."
This discussion has been archived. No new comments can be posted.

x86 Assembler JWASM Hits Stable Release

Comments Filter:
  • by tjstork ( 137384 ) <> on Friday January 29, 2010 @04:01PM (#30953980) Homepage Journal

    To know how abandoned MASM really is... try and make an assembler project in 64 bit under Visual Studio 2008. It's not even supported out of the box - like, they never actually tested the configuration.

    But, for all that, I prefer YASM as the assembler. Still, congrats to the OpenWatcom port.. NICE WORK. It's always good to have more hands in an area that so many people see as dead.

  • xor my heart (Score:5, Interesting)

    by RabidOverYou ( 596396 ) on Friday January 29, 2010 @04:04PM (#30954034)
    I loved saying in an interview "I see you have x86 assembler on your resume". The color drains from the kid's face, I give 'em a snippet:

    xor ax,dx
    sub ax,dx

    It's nothing rocket, just some fun with 2s-complement.

    -- Rabid
    • i'm terrible with x86 assembly, is that the xor swap algorithm []?

      • I believe it sets dx to the MSb of ax and ends up leaving ax unchanged.

        • Re:xor my heart (Score:4, Informative)

          by onionman ( 975962 ) on Friday January 29, 2010 @04:39PM (#30954542)

          I believe it sets dx to the MSb of ax and ends up leaving ax unchanged.

          oops! I guess I'm getting my AT&T syntax and my Intel syntax confused. If it's Intel syntax, then:

          cdw ;; copy MSb of ax to all bits of dx
          xor ax, dx ;; if MSb of ax was 1 then flip bits of ax, otherwise, no effect
          sub ax, dx ;; if MSb was originally 1, this will add 1 to the flipped bits. otherwise, no effect

          So, assuming Intel syntax, this computes to absolute value of ax and sets all the bits of dx to be the sign bit

          • So, we only learned MIPS in school. Why does x86 have different syntaxes? Do different assemblers just have different psuedoinstructions or something? That seems a bit kludgy to me...
      • Re: (Score:2, Informative)

        by mparker762 ( 315146 )

        No, that snippet compares AL and DX, leaving AX with 1's everywhere except the first different bit, which will hold a 0.

        AL= 00001101
        DX= 00000010 00011001

        CWD just puts a 0 in AH
        AX= 00000000 00001101
        DX= 00000010 00011001

        XOR ax,dx computes ax ^= dx
        AX=00000010 00010100
        DX unchanged

        SUB ax,dx computes ax -= dx
        DX unchanged

        The XOR swap algorithm to swap ax and dx is:
        xor ax,dx
        xor dx,ax
        xor ax,dx

        • Re: (Score:2, Informative)

          by clone53421 ( 1310749 )

          Incorrect. It converts AX to the absolute value of AX.

        • Re: (Score:3, Informative)

          by P-Nuts ( 592605 )

          Don't think that's quite right. As I said in my other reply, I had to look up CWD in the Instruction Set Reference:

          The CWD instruction copies the sign (bit 15) of the value in the AX register into every bit position in the DX register.

          So this means if AX was originally positive, nothing happens, and if AX was originally negative the XOR flips the bits of AX, then the SUB subtracts minus one from it (which is the same as adding one). This is the same as the two's complement unary minus operation. So the s

    • by P-Nuts ( 592605 )
      That's a bit cruel. I had to look up CWD, but I presume there's not much need for it or it's CDQ/CQO brethren since the 16-bit days.
      • You also have to be really careful using instructions that update less than a full 32-bit register on modern X86s (such as these 16-bit instructions). You could get "partial register stalls" if you try to read the full-width EAX or EDX after such a sequence. That could toss a big wrench into the deep execution pipeline while the CPU hunts around amongst dozens of pending micro-ops for the appropriate contents of the upper half of the register.

        • by epine ( 68316 )

          Amazing how rusty the pipeline-stall instruction group becomes after twenty years of disuse. CWD is a little outside the nucleus of RISC instructions screaming to break free. Not the inner circle of hell, but one of the antechambers. More worth forgetting than recollecting.

          The true lesson of our x86 heritage: discretion is the greater part of valour. There's a *lot* of aging x86 instructions that belong to the HCF group for all practical purposes.

    • by paskie ( 539112 )

      I've never done anything really big in assembler but I'd say cwd is somewhat obscure thing, poor kid. :) I'd rather check if they understand what and how lea does, or some basic non-obvious test stuff.

      ([spoiler] So, am I completely stupid or is the snippet abs()?)

      • Re: (Score:3, Informative)

        by Rockoon ( 1252108 )
        cwd isnt obscure.. well, it wasnt in the 16-bit days.

        The modern equivalent in 32-bit mode is cdq ..

        These is absolutely necessary instruction when performing division, because on the x86 line division takes a double wide numerator from dx:ax in 16-bit, or edx:eax in 32-bit.
    • Re: (Score:3, Interesting)

      by TheRaven64 ( 641858 )
      Do you hire people who need to know obscure bits of x86 asm often, or is this just a way of catching people who exaggerate on their CVs?
      • by elnyka ( 803306 )

        Do you hire people who need to know obscure bits of x86 asm often, or is this just a way of catching people who exaggerate on their CVs?

        Probably the later, which is completely legit. It could be a bit uncalled for if the position the interview is for is, say, for developing web pages. But still, with something put on the resume, you take it (or put it) at risk. It would be very questionable, however, if a person is solely dismissed for passing a trivia, specially if it is not related to the job at hand (not that I'm accusing RabidOverYou of doing that, just sayin'...)

        If you put something on your resume, you better be able to back it up te

        • Re: (Score:3, Insightful)

          by elnyka ( 803306 )
          ... plus a person willing to put "Assembly" in the resumes should be aware that it implies dexterity with binary arithmetic, bitwise ops, 2-s complements and all of that good shit.
          • The last time I put "assembly" (i.e., putting together lab benches) on my resume, someone asked me if I was a mainframe programmer. No. But I did some 6502 assembly on the Commodore 64 and could program a 68000 from the data book on paper. That didn't count.
    • It took me a minute to remember what CWD does, but it converts a word (AX) to a dword (dx:ax).

      So, if AX is positive, you have this:

      0000:ax - cwd - zeros out DX
      0000:ax - xor ax,dx - xors AX with 0000
      0000:ax - sub ax,dx - subtracts 0 from AX

      Whereas, if it’s negative, you have:

      FFFF:ax - cwd - fills DX with 1s
      FFFF:~ax - xor ax,dx - takes the bitwise complement of AX
      FFFF:(~ax)+1 - subtracts -1 from AX

      So in the end you have (~ax)+1, which is of course the absolute value of your original AX.

      • Re: (Score:3, Informative)

        by clone53421 ( 1310749 )

        the absolute value of your original AX

        Come to think of it, that’s just in AX. DX contains the sign of AX.

        I.e. it’s this, in terms of pseudo-code:
        DX = sign(AX)
        AX = abs(AX)

    • Re: (Score:3, Interesting)

      In the year 1973 I was employed by a company called Cascade Data. It was located in Cascade Michigan which was close to Grand Rapids. I was a computer programmer at the time. They manufactured computers that started with 16k bytes of magnetic core memory and could be double to 32k. They had a 5 Megabyte hard drive but most used a tape drive for storage. Input was from a typewriter like device as one would type in on a keyboard and the output was on paper. I wrote programs in both RPG and assembly lan
    • Possibly off-topic - but - can anyone tell me if there is much demand for x86 assembler developers?

      I'm a 'cookie cutter' .Net Developer. From what I understand, I'm pretty much a dime a dozen....I'm thinking of trying something new.

    • by Myria ( 562655 )

      I see your x86 absolute value trick and raise you my MIPS absolute value trick:

      bgtz a0, label
      subu a0, zero, a0

    • I feel your pain. I'm in a similar position, but it's even a bit more specialized. I need people who have experience with reverse engineering and no criminal background (i.e. are not only good reversing...). And are available. And that includes being able to read and understand asm code written by someone else. Worse, asm code that a disassembler created. Which is mostly straightforward, granted, since high level languages create fairly easy assembler code. Still, there's always that odd debugger trap and a

  • by Anonymous Coward

    Japheth has a number of rather interesting projects that extend the functionality of DOS.

    JEMM, which is his EMM386 replacement:
    HX DOS Extender, which adds Win32 PE & basic API support to DOS to allow the execution of a whole array of apps:

    • by Dwedit ( 232252 )

      Note: NOT the same JEMM that came with Privateer.

    • by glwtta ( 532858 ) on Friday January 29, 2010 @04:22PM (#30954312) Homepage
      Japheth has a number of rather interesting projects that extend the functionality of DOS.

      Awesome, I'm always on the lookout for cool stuff like this to keep my DOS workstation cutting edge.
    • HX DOS Extender, which adds Win32 PE & basic API support to DOS

      I wasn't quite sure what you meant by this, because what you seemed to imply it did seemed just too wrong to exist, but it turns out that it really is a DOS extender that comes with partial Win32 support. Yes, you can now run DOSBox under DOS (and a lot of other single-window Windows apps; it probably wouldn't be too hard to add a windowing system either, but that would be far too wrong). Now all he needs to do, I guess, is add a POSIX layer...

  • by Colin Smith ( 2679 ) on Friday January 29, 2010 @04:09PM (#30954098)

    We have Java!


  • by Anonymous Coward on Friday January 29, 2010 @04:09PM (#30954100)

    January 2010 is an exciting month for x86 assembly language developers.

    I'm sure the two of them will be pleased.

    • Re: (Score:3, Funny)

      by Chapter80 ( 926879 )

      The first thing I'm going to do with this new assembler is to write a C compiler, and then write Python in C, and then I can get down to work...

  • by omar.sahal ( 687649 ) on Friday January 29, 2010 @04:13PM (#30954142) Homepage Journal
    Or you could use gcc

    Programming from the Ground Up []

    I highly recommend working through this book even if you'll never program assembly again... you'll be a vastly better programmer. -- Joel Spolsky,

  • I'll ask it (Score:3, Interesting)

    by jgtg32a ( 1173373 ) on Friday January 29, 2010 @04:22PM (#30954332)

    What's the difference between all of these different Assemblers? Aren't they all just x86, AMD64, or IA32

    • Re:I'll ask it (Score:5, Informative)

      by TheRaven64 ( 641858 ) on Friday January 29, 2010 @04:52PM (#30954780) Journal
      The big difference is the syntax. Microsoft's assembler uses Intel syntax, while the GNU assembler uses AT&T syntax. The order of operands is different, the syntax for the different addressing modes is different, and instructions have operand size suffixes in AT&T syntax. Beyond that, there are differences in the types and flexibility of the macro system. GNU assembler, for example, uses the C preprocessor for macros, which sucks for C and is even worse for anything else. Other assemblers have complex macro languages.
    • FASM is another cross-architecture assembler, but with an interesting philosophy. Everything you need to compile something is stored inside the files.

      There's none of this gcc.exe --[4 lines and 900 characters of garbage resolving dependancies and changing settings]

  • by Anonymous Coward on Friday January 29, 2010 @04:31PM (#30954442)

    I still weep slightly when I think of Watcom and their products. They were, by far, among the best out there in the 1980s and early 1990s. I mean, they made Borland's offerings look like garbage, and Borland was pretty damn good at that time, too.

    Their assembler and C and C++ compilers were fucking amazing. Nobody generated faster code than them. I remember once moving some code from Microsoft's C++ compiler to Borland C++, and getting a 5 times speedup. Then we moved it from Borland C++ to Watcom C++, and got an additional 8 times speed improvement! We were totally blown away. Their code generator was just that much better than that of much larger competitors.

    Watcom SQL was another gem. So much faster than the competition, but also so much easier to use and develop for. It's good to know that Sybase has kept this product alive and well.

    To see such a small shop create some high-quality products is truly a testament to the fantastic talent that they had working there. It saddened me greatly to see them consumed by Powersoft, and then Sybase.

    • To see such a small shop create some high-quality products is truly a testament to the fantastic talent that they had working there. It saddened me greatly to see them consumed by Powersoft, and then Sybase.

      This is the big benefit of Capitalism. You produce something good, it rocks the boat, then you get bought over and buried. It's the natural order.


    • jello stacking (Score:4, Interesting)

      by epine ( 68316 ) on Friday January 29, 2010 @09:21PM (#30958116)

      I never got a five times speedup over Microsoft, but we consistently got 30% reduction in code size, which on a 640KB machine is not to be sneezed at. A big part of that was the excellent register calling conventions and pragma support.

      The reality is that Watcom C++ was crushed by Microsoft Visual C++ which had a slick interface lashed onto appalling C++ language support. This was an era when anything slapped in a box was saleable software.

      People forget that before eyeballs displaced profit, fatuousness displaced quality. It didn't matter very much if the feature worked as advertised. Software users, like deluded sports fans, believed that hope springs eternal. Maybe it would work in the next version? Sadly, programmers fell for the hype just as often as the end consumers. RIP Watcom.

      The day Watcom packed it in—effectively about a version before their last release—I knew that quality had lost the race for many years to come. I didn't have it in me for a career in jello stacking, so I went off for a while to do my own thing. These days, quality is back on the table, for jobs that no longer exist. But if they did, it would be good times again.

      Bill Watterson really knew what he was doing when he drew all those snowmen in the first half of the 1990s.

  • "January 2010 is an exciting month for x86 assembly language developers"

    Somehow I have a hard time imagining a bunch of x86 assembly programmers getting excited. I've done assembly on a lot of different architectures, and I can't say "excitement" was ever a term I'd use to describe any emotions related to it.

    "Oh wow! There's a new tool that might make some poor saps lives suck slightly less! This is such an awesome month!"

    • I dunno. The first time I successful assembled the code to boot my '386 into protected mode, spawn a task, print 'Hello, World.' to the screen, then gracefully exit I was rather excited. I was close to 20 years younger then and had less of a life though.

      • I've done that on ATmega processors, but not x86. With x86 hardware so cheap now, the only reason I have to use ATmega's is power savings, but the loss of CPU power makes it not worth it for my toying around.

        I'm interested in doing exactly what you did 20 years ago. Would you know of a decent place to find the documentation required to do this? Like info on video output and such? Just a general basic getting started website or even a book, I don't mind buying something for the knowledge.

        I'm a C guy, but

        • You should probably take a look at QEMU. It can emulate a variety of platforms, including a couple of ARM chips with various peripherals. Or a SPARC workstation, or a PowerPC system. And, of course, x86. It will boot these from a ROM image, so you can easily give it your binary to load with no OS, if that's what you want.
    • Of all CPU architectures, I think x86 assembly is exciting. In the same way that crossing a rickety bridge over a pit of lava is exciting...
  • why? (Score:4, Interesting)

    by Lord Ender ( 156273 ) on Friday January 29, 2010 @04:35PM (#30954502) Homepage

    What is primary use of assembly these days? I thought C gave you the same level of control, but with portability and much-improved readability.

    And to give you an idea of where this question is coming from, the last app I wrote was a web app runs in JRuby, using DataMapper to free me from dealing with SQL and Sinatra to free me from dealing with HTTP/CGI. It runs on the Google App Engine cloud. My world is so high-level, with so many layers of virtualization and encapsulation, that I can barely see assembly way down there at the bottom of the stack...

    • Re:why? (Score:4, Insightful)

      by Anonymous Coward on Friday January 29, 2010 @04:46PM (#30954680)

      And this is precisely why Facebook requires 30,000 servers.

      • Re: (Score:2, Informative)

        by mick232 ( 1610795 )

        And this is precisely why Facebook requires 30,000 servers.

        They might need 30.000 servers, but at least they don't need 30.000 programmers and another 30.000 testers.

    • Re:why? (Score:4, Informative)

      by Anonymous Coward on Friday January 29, 2010 @04:49PM (#30954730)

      Not quite. There are always situations when writing an operating system where you need assembly. For example, impelmenting the actual 'guts' of a context switch requires fine tuned control over what is in each register.

      (C programs tend to assume the stack is available. But in the middle of a context switch, it might not. Assembly gives that level of control).

      • Re:why? (Score:5, Informative)

        by TheRaven64 ( 641858 ) on Friday January 29, 2010 @05:03PM (#30954982) Journal
        Bits of the C standard library too. You can't implement setjmp() or longjmp() in C, while they're pretty trivial in assembly. Various other functions (e.g. most of math.h) will probably be faster with some inline assembly too, although these days compilers tend to provide built in versions of these functions that you can call and have them replaced with a single instruction.
      • C programs should better not assume a stack is available, what if they're compiled for a system that features no stack?

        The basic problem is that C programs do not assume anything about low level hardware, because there are so few tools that can actually access things like registers, flags or stack directly. Simply because of the all important notion that C code is to be portable and that you must not assume those registers, flags or stack exist on that other platform.

    • Not everything is exposed to C. C is designed for PDP-11s. It doesn't have any of the more advanced CPU features. If you want to use any privileged instructions (required for writing an OS), if you want to use SIMD units, if you want to use things like population count instructions, then you can't use portable C.

      This doesn't always mean that you have to use assembly. Most instructions are exposed via platform-specific intrinsic functions. The code generator in the C compiler will handle register alloc

    • There's a couple of places:

      1) Really tiny microcontrollers with 100 bytes of RAM. These are pretty easily programmed in assembly, though, because there's just not that much to do. However, this isn't affected by this news, since these microcontrollers are most certainly not x86-architecture.

      2) The Linux kernel has a little bit of assembly for some low-level hardware initialization stuff. However, for the x86 stuff, they seem to be getting along just fine with nasm. Why anyone would care about a differe

    • by EzInKy ( 115248 )

      In addition to what others have said, it's helpful for compiler programmers to have a little knowledge of assembler too.

      • It's helpful for any kind of programmer (if he's not going to be stuck in C#, Java or some other language that gives him zero chance to fuck with the contents of his memory directly) to know a bit about the architecture underneath his program.

        If programmers did know a bit more about how the stack on a x86 machine works, we'd probably have fewer buffer overflow security holes.

    • NOD32 (one of the faster antivirus programs for windows) uses assembly for speed reasons.

  • How does JWASM compare with Flat Assembler? []
  • Wikiwars (Score:5, Informative)

    by SarekOfVulcan ( 133772 ) on Friday January 29, 2010 @04:55PM (#30954844)

    Be warned -- JWASM's Wikipedia article was nominated for deletion [], as it was thought that notability was not sufficiently asserted. The flame war there might spill over here as well. :-(

    • Re:Wikiwars (Score:5, Insightful)

      by Just Some Guy ( 3352 ) <> on Friday January 29, 2010 @06:27PM (#30956182) Homepage Journal

      Be warned -- JWASM's Wikipedia article was nominated for deletion

      And that right there's why I won't donate a penny to that project. Honestly, WTF? That article's source is about 13KB long. At $100/TB, it costs about 1/7800th of a penny to store. "But what if it clutters up the site!", say the Deletionists. Apparently there's an alternate front page to Wikipedia that lists every single article and it's critical that it be kept tidy and short.

      Actually, I take that back: can I send Wikipedia a penny and sponsor a few thousand articles of my choosing, starting with this one?

      • Re: (Score:2, Interesting)

        by stupido ( 1353737 )

        "Deleted" articles don't get deleted from the Wikipedia database at all. They just get hidden from the public. An administrator can undelete them at any time. So, there's no monetary saving involved. Arguably, plain spam should be removed from the site, but JWASM is obviously not that. It is even discussed in Fog Agner's book, which normally meets the requirements for a Wikipedia article. See my post [] above. I can't be bothered to read the insanely long deletion discussion to see why that's not enough for th

        • Untrue, deleted articles will eventually be purged. They may not be instantly purged, but Wikimedia most certainly is capable of completely removing data from itself.

      • Re:Wikiwars (Score:5, Interesting)

        by BikeHelmet ( 1437881 ) on Friday January 29, 2010 @09:14PM (#30958058) Journal

        Articles about old hardware often get deleted too. Socket A motherboards and stuff. I've seen articles on older cellphone SoCs and their companies vanish as well. Apparently never getting large and then finally going out of business means you don't deserve to be noted in history.

        • Seems like a pretty shitty repository of knowledge doesn't it.

          Its certainly no Jedi archive or Stargate Ancients head sucker repository of knowledge downloader thingy.

        • by richlv ( 778496 )

          egad. can we please expose, bring out and torture people who delete (or propose for deletion) such pages ?
          the power of wikipedia is finding all kinds of pretty obscure information, neatly laid out and described. if it's not, i sometimes fix a thing here or there myself.
          notability requirements are required, we wouldn't want an article on every person ever lived, but that's the opposite extreme.

          • Re:Wikiwars (Score:4, Insightful)

            by Just Some Guy ( 3352 ) <> on Saturday January 30, 2010 @11:12AM (#30962328) Homepage Journal

            we wouldn't want an article on every person ever lived

            Why? Say that's 10 billion people, and each article is 10KB. That comes out to 100TB and a modest database to reference it all. In 2010 technology, I could afford to buy and run that hardware out of my basement if I really wanted to. Keep in mind that hosting 10G articles is a lot different from serving that many.

            As long as it doesn't bog down the search engine, is there any practical reason to care? Especially when instead of 10G articles, we're talking about something on the order of 1 million.

        • It is a disgrace Wikipedia isn't more inclusive. Who the hell has the authority to fix this? Sometimes it seems like the (seemingly) self-elected moderators run the show and delete what they please.
  • LLVM (Score:3, Informative)

    by eulernet ( 1132389 ) on Friday January 29, 2010 @05:10PM (#30955100)

    Frankly, optimizing assembly code is a PITA, since there are so much different flavors.
    For example, AMD and Intel processors have different types of optimization.

    If I were to code in assembly nowadays, I'd prefer to use something like LLVM: [] which should be able to generate good optimized code for any kind of processors, without the hassle of maintaining one routine per processor.

    In some very extreme cases (like coding a RC5 decoder or multiprecision routines), it's still useful to use assembler, but in most other cases, I'm sure that LLVM is able to generate code much better than you could achieve manually in the same amount of time.

    • If I were to have to write something in assembly, I'd hate to have to use LLVM (and I've written two compilers that use LLVM on the back end and have commit access to LLVM). Writing static single assignment code is absolutely no fun. Beyond that, there's almost nothing that you can do in LLVM that you can't do in C (the LLVM intrinsics are all exported as C intrinsics in clang), the only exception is setting up DWARF unwinding tables, and, having written code to do that for two high-level languages, I wou
  • That's good news (Score:3, Interesting)

    by bl8n8r ( 649187 ) on Friday January 29, 2010 @05:29PM (#30955350)

    msg db 'Because I kinda like assembly.$'
    mov ax, seg msg
    mov ds, ax
    mov ah, 9
    int 21h
    mov ax, 4c00h
    int 21h

  • IDA Pro (Score:3, Interesting)

    by mpsmps ( 178373 ) on Friday January 29, 2010 @05:42PM (#30955562)
    It's far from cheap (let alone free) and it's not an assembler, but IDA Pro [] is indispensible for anyone who needs to develop, analyze, or debug code in assembler. It can't assemble code for you but it does everything else ( []) you've thought of and many you haven't.
  • I used to program anything serious in assembler until, say, 1991. Then I moved to C++/Pascal, but always hand-tuned critical parts with Assembler. Around 1995 I realized compilers are doing better job in optimization of those critical parts then my hand-crafted assembly code. I think currently it is only useful for SIMD instructions and similar cases where it is hard for compiler to figure parallel data manipulation with specialized instructions. With ongoing improvements in compilers, those will go away to
  • MASM abstracts too much for my tastes. MASM does a lot of things automatically that you don't necessarily want, and it's irritating. Also, it is sometimes context-sensitive: "mov eax, meow" differs in meaning in MASM depending on whether "meow" is a variable or a label. The former means to read the value stored in "meow" (mov eax, [meow]), and the other means to load the address of "meow" (mov eax, offset meow).

    Also, MASM code frequently uses things like ".IF" statements to build conditional blocks for y

They are called computers simply because computation is the only significant job that has so far been given to them.