Skip to content
The Punctilious Programmer

Learn IBM Assemb;y Lsnhushr

woolbright_david@icloud.comwoolbright_david@icloud.com
  • IBM Mainframe Assembler
  • The Video Course
  • Course Datasets
  • Test Bank
  • The Big Blue Assembler Book
  • Visiblez Home Page
  • IBM Enterprise COBOL
  • Punctilious Publishing
  • Advanced Assembler Class
Close Menu
The Punctilious Programmer IBM Mainframe Assembler

IBM Mainframe Assembler

IBM Documentation for Assembler Programmers

Principles of Operation(Z17)
Z Architecture Reference Summary(Z16)
HLASM Programmer’s Guide
HLASM Language Reference
Assembler Services Reference (ABE-HSP)
Assembler Services Reference (IAR-XCT)
Assembler Services Guide
z/OS 3.1 MVS System Codes
z/OS 3.1 MVS Programming: Extended Addressability Guide
z/OS 3.1 MVS JCL Reference

IBM System/360 Reference Green Card

Some Advice From an Old Guy
IBM System/360 IBM Reference Data Green Card Part 1
IBM System/360 IBM Reference Data Green Card Part 2
IBM System/360 IBM Reference Data Green Card Part 3
IBM System/360 IBM Reference Data Green Card Part 4

Introduction to Debugging

Add your JCL to the programs. Data file included here.
Debugging an S0C1 (MP4) BOMBS0C1.TXT Code
Debugging an S0C4 (MP4) BOMB2.TXT Code
Debugging an S0C7 (MP4) BOMBS0C7.TXT Code
Debugging Another Type of S0C7 (MP4) S0C7PRT2.TXT Code

Blog Posts

     
Debugging Abends: An Introduction
Review an Instruction: MG
Review an Instruction: MFY
Reaching Above the Bar
Review an Instruction: LLGTR and LLGT
Review an Instruction: LBH
Video: Visual Depiction of Eleven Load Operations
Something Different: Visual Prompts for Loads
Review an Instruction: LB (IBM Assembler – HLASM)
Review An Instruction: LAY (IBM Assembler – HLASM)
Review An Instruction: LARL (IBM Assembler – HLASM)
A Sixpack of Instructions (IBM Assembler – HLASM)
Review an Instruction: EXRL
Review an Idea: Using IBM Macros – Standard, List, Execute
Review an Instruction: CGRB
Review an Instruction: CRB
Review an Instruction: AGSI
Review an Instruction: ASI
Review an Instruction: AGF
Review an Instruction: AFI
Review an Instruction: LOC
Adding Binary Fields Without a Register
Standard Entry and Exit Video
Adding Binary Fields without a Register
Adding Away (AFI, AG, AGF)
What’s the Difference Between LCR and LNR?
Two’s Complement for Programmers
Brush Up Your USING Skills
Shifty Shifts
Print Your Own Z 15
How to Print a Register

General Articles on Programming in Assembler

Conditional Assembly and Macros (MP4) Macro Lecture 2 (MP4)
Conversion of Binary, Decimal, and Hexadecimal Data System/z Architecture
Character Data Packed Decimal Data
Binary Data The Define Constant Directive
Data Conversions Organizing a Simple Assembler Program
Sequential File Processing (QSAM Files) Loops
Packed Decimal Arithmetic Base Displacement Addressing
Dsects Explicit Addressing
Instruction Formats Program Linkage
Address Constants Reading Object Code
Base Displacement Addressing Explicit Addressing
Jumping Into Branches Techniques For Converting From Binary to Packed-decimal
Two’s Complement for Programmers Standard Entry and Exit
Macro Lecture Demo (MP4) Standard,Execute, and List Form Macros
Alignment (PDF)

Visual Prompts For Certain Individual System/z Instructions

How to use the Visual Prompts for Grande Arithmetic (MP4)
Visual Prompts For Grande Multiplication (pdf)
Visual Prompts For Grande Addition (pdf)
Visual Prompts For Grande Subtraction (pdf)
Visual Prompts For Grande Division (pdf)
Visual Depictions of Eleven Load Instructions (PDF) Video Discussion of the Eleven Load Operations (MP4)

Articles on Individual Instructions

A AFI AG AGF AGFI AGSI AH AP AR ASI AY
BAKR BAS BASR BC BCR BCT BCTR BRAS BRASL BRC BRCL BRCT
CGRB CLC CLI CH CP CR C CRB CVB CVD
D DP DR
ED EDMK EX EXRL
IC ICM Insert Instructions
L LA LAA LARL LAY LB LBH LCR LG LH
LM LNR LOC LLGTR LLGT LPR LR LRL LTGR LTR LY
M MFY MG MGH MH MHY MP MR MS MSR MVC MVCL MVI MVN MVZ
N NI NR
O OC OI OR
PACK
S SLA SLDA SLDL SLL SPM SR SRA SRDA SRDL SRL SRP SRST ST
STC
STH
STM
STOC
STY
SH
SP
SY
TM TP TR TRT
UNPK
X XC XI XR
ZAP

Video on Single Instructions

A AFI AG AGF AGSI AH AP AR ASI AY
BAS BASR BC BCR BCT BCTR BRAS BRASL BRC BRCL BRCT
CGRB CLC CLI CH CP CR C CRB CVB CVD
D DP DR
ED EDMK EX
IC ICM
L LA LARL LAY LCR LH LM LNR LOC LPR LR LTR
M MP MH MVO
NI NR
PACK
SRDA SRP STM SP
TP TR and TRT
UNPK
ZAP

IBM Assembler Notes for the Book Chapters

Table of Contents
Chapter 1: Starting Assembler
Chapter 2: Do You Zee What I Zee?
Chapter 3: A First Program
Chapter 3: Skeleton Program (txt)
Chapter 4: How System/z Works
Chapter 5: Character Study
Chapter 6: File It Under I or O
Chapter 7: Slowly, I Turn
Chapter 8: Packing It In
Chapter 9: Bin There, Done That!
Chapter 10: Assembler For Dummies
Chapter 11: When I’m Calling You
Appendix A – Connecting to the mainframe, Editing, and Submitting Programs Appendix B – Arithmetic Conversions: Decimal, Binary, Hexadecimal

102 thoughts on “IBM Mainframe Assembler”

  1. brian long says:
    July 18, 2012 at 10:04 am

    the video “a first program” is not complete, can you please tell me where the rest of it is please?

    Reply
    1. dwoolbright says:
      July 18, 2012 at 8:01 pm

      Brian,
      Thanks for letting me know. I rerecorded the end and reposted it, so you should see it now.
      DW

      Reply
      1. brian says:
        July 19, 2012 at 9:04 am

        sorry but the video “a first program” is still only 4mins long, it does not completely go through the assembler program? Can you please show me the rest of that video? Thanks for your help. Brian.

      2. dwoolbright says:
        July 19, 2012 at 4:23 pm

        I’m able to download it here at home – 25:17 minutes, but perhaps that is my local copy. I’ll try from school a little later today on a different machine. I’ll let you know what I find.

      3. dwoolbright says:
        July 19, 2012 at 7:42 pm

        Brian, I was successful downloading the video on a different machine at school with this link: http://csc.columbusstate.edu/woolbright/Asmv004/Asmv004.html
        Do you think it is caching the old version on your machine? If you still can’t get it, let me know and I’ll try something else.
        David

  2. brian says:
    July 20, 2012 at 9:21 am

    i am so sorry but even that link still only plays 4mins16secs of the video? is it possible for you to email me it, i am trying to learn assembler and am really interested in watching this as it looks really good and very clear. Sorry for being a pain. Brian.

    Reply
    1. dwoolbright says:
      July 20, 2012 at 5:00 pm

      Brian,
      I zipped the video and posted it on the site: http://csc.columbusstate.edu/woolbright/WOOLBRIG.htm
      You should see a new link to the zip on that page.
      Let me know if that works.
      David

      Reply
  3. Sankalp Mathur says:
    May 28, 2013 at 1:52 pm

    Respected Sir,
    All your videos are really of great help. I request you to please post a video which can demonstrate the functioning of Move with Offset instruction(MVO). I would be greatful to you Sir.

    Reply
    1. dwoolbright says:
      May 29, 2013 at 5:43 pm

      Sankalp,
      Good idea. I’ll post a video on MVO soon.
      DW

      Reply
  4. Anonymous says:
    February 7, 2014 at 8:02 am

    I’m currently learning mainframe assembler and your videos are really helping me get up to speed quickly. Having a voice track along with the visuals is priceless. I really appreciate that you have this content openly available.

    Reply
  5. dwoolbright says:
    February 7, 2014 at 8:11 am

    Thanks for taking time to send your thoughts … I really appreciate that.

    Reply
  6. ranjeevan says:
    February 23, 2014 at 8:07 pm

    Hi, these videos are pretty good for a learner.. I appreciate that.
    Also, do you have any videos on useful tips on assembler to cobol conversion?

    Reply
    1. dwoolbright says:
      March 3, 2014 at 8:39 pm

      I don’t currently have any videos that address that directly. I am thinking about releasing my Cobol course videos which relate the Cobol datatypes to assembler datatypes.

      Reply
  7. Manish Bansal says:
    July 12, 2014 at 8:51 pm

    Hi,
    There seems to be a small error in the video titled ‘SS1 Instructions, MVC, CLC, Branching, Fetch/Execute Cycle’ around the point where you are explaining CLC op code and the instruction ‘CLC Z,X’.

    The remaining two bytes of X will not come from Y because we have defined X as DC of length 5. So we are going to get two bytes of spaces on the right in X. Please correct me if I am wrong.

    Thanks for all your videos. I am learning a lot.

    Reply
    1. dwoolbright says:
      July 12, 2014 at 10:20 pm

      You’re right, Manish. It’s a 4 byte compare and the 4th byte is a space in the X field. Thanks.

      Reply
  8. Tong Kongswang says:
    July 24, 2014 at 8:53 am

    Hi, I am trying to restore back my Assembler programming skill. I wonder if you have real situations on using ICM and STCM. Thanks. Kongswang

    Reply
    1. dwoolbright says:
      July 24, 2014 at 5:27 pm

      ICM is sometimes used to load a fullword into a register when the the fullword in memory is not properly aligned. A load instruction would cause a warning from the assembler, but ICM will not. In a similar fashion STCM can be used to store a fullword into an unaligned field in memory. Keep in mind that ICM doesn’t sign extend the register when it inserts a value like LH does.

      Reply
  9. Arumugam says:
    August 16, 2014 at 4:00 pm

    In UNPK video (@03:19), example instruction shows UNPK X,Y, here we are upacking OPR2 to OPR1 that is OPR1 should be a zoned decimal.
    I think the instruction should be UNPK Y,X instead of UNPK X,Y. Similary the next example too should be reversed. Thanks.

    Reply
    1. dwoolbright says:
      August 20, 2014 at 11:46 am

      Thanks for pointing out the error. I updated the powerpoint file to be correct and added a callout to the video that points out the problem. Many thanks for taking time to let me know!

      Reply
      1. Arumugam says:
        August 21, 2014 at 1:32 pm

        Thank you, all the videos are very helpful. I have a quick question.
        whats the difference between BASR and BALR? I see, most of the programs which we work use only BALR before USING *,R12.

      2. dwoolbright says:
        August 21, 2014 at 2:18 pm

        BASR was introduced when address sizes changed from 24 to 31 bits. Addresses can now be 24, 31 or 64 bits. BALR saves a 24 bit address and some other information from the PSW. BASR saves a 31 or 64 bit address depending on the addressing mode you are running in. It is safer to change older programs to use BASR instead of BALR since you are probably not running in a 24 bit addressing mode. All new code should use BASR. In most cases you won’t notice a difference, but an older program that uses BALR on a newer machine may cause a problem.

  10. Arumugam says:
    August 24, 2014 at 2:11 pm

    Just curious, what is the significance of DC X’FFFFFFFF’ before DCB declaration in your soc9 program?? Thanks.

    Reply
  11. kishore says:
    January 18, 2015 at 12:59 pm

    Hello sir this videos are very Helpful to learn Asseembler

    Reply
  12. Adrián Mouly says:
    May 18, 2015 at 12:05 am

    Awesome courses!! Have you got the PPTs for the first videos on the list? I need that for reading it again without the video. Thanks for your effort!

    Reply
    1. dwoolbright says:
      May 18, 2015 at 1:39 pm

      Thanks for the kind words. You should be able to find the ppt using the first link on this page: http://csc.columbusstate.edu/woolbright/WOOLBRIG.htm
      David

      Reply
  13. Bob says:
    March 6, 2016 at 5:19 pm

    This is an awesome website. I really like the tutorials. It would be good if you created a channel on youTube and then I could watch the videos on TV 🙂

    Reply
    1. dwoolbright says:
      March 6, 2016 at 6:01 pm

      I’ll give it some thought. Thanks for the suggestion. – David

      Reply
  14. Wilsu says:
    March 29, 2016 at 10:21 am

    Many thanks for this site. I just started using IBM Assembler at work and this has helped me out a LOT so far!

    Reply
    1. dwoolbright says:
      March 29, 2016 at 6:44 pm

      Thanks for letting me know!

      Reply
  15. Venkat says:
    July 16, 2016 at 2:08 pm

    Could you please share your thoughts on this..
    AP =X’111C’,=X’119D’

    How would assembler responds when it encounters both operands on AP as literal a.

    Thanks much in advance!

    Reply
    1. dwoolbright says:
      July 16, 2016 at 11:45 pm

      The literals produce two two-byte fields in memory. -119 is added to +111 to produce -8. In hex, the result is 0008D.

      Reply
  16. Girish says:
    July 18, 2016 at 9:14 am

    Could please let me know,why cc=2 not set in TM instruction?

    Thanks in advance!!!!!!!!!!

    Reply
    1. dwoolbright says:
      July 18, 2016 at 2:49 pm

      There are only 3 possibilities when testing bits:
      1) All the tested bits are zeroes – In this case we can use the mnemonic BZ and think Branch all zeroes (instead of Branch zero) BZ tests condition code 00 = 0
      2) All the tested bits are ones – In this case we can use the mnemonic BO and think Branch all ones (instead of Branch on Overflow) BO tests condition code 11 = 3
      3) The tested bits are mixed (some 1’s some 0’s) – In this case we can use BM and think Branch Mixed (instead of Branch Minus) BM tests condition code 01 = 1
      So… condition code 10 = 2 was left out so we could get double use out of the other mnemonics we have. (BH or BP is used for condition code = 2)

      Reply
  17. Venkatarao Bandaru says:
    October 19, 2016 at 2:05 am

    Hi Dwool Bright,
    In the house keeping section like the one below
    STM R14,R12,12(R13)
    BASR R12,R0
    USING *,R12,R11
    LA R11,2048
    LA R11,2048(R11,R12)
    ….
    ….
    1. What if BASR R12,R0 is not precede USING *,R12,R11?
    2. USING (base address), REGISTER
    does USING directive says assembler to treat particular Register as a base register with the mentioned base address..in the above case * i.e current location counter..well if that is the case why we need BASR R12,R0 ?

    3. What if I write like
    STM R14,R12,12(R13)
    BASR R12,R0
    LA R11,2048
    LA R11,2048(R11,R12)
    USING *,R12,R11

    there is no address resolution being calculated in both LA statements so is it a right way to set Base register?..will there be any issues with Domain regarding R11 and R12?

    Thanking you in advance!

    Reply
    1. dwoolbright says:
      January 6, 2017 at 11:37 pm

      Venkat,

      I think I may have missed your email of several months ago. Many apologies. I will respond underneath in bold.

      Hi Dwool Bright,
      In the house keeping section like the one below
      STM R14,R12,12(R13)
      BASR R12,R0
      USING *,R12,R11
      LA R11,2048
      LA R11,2048(R11,R12)
      ….
      ….
      1. What if BASR R12,R0 is not precede USING *,R12,R11?

      If you coded this USING *,R12,R11

      BASR R12,R0

      The base address for R12 would be the address of the BASR, but then BASR R12,R0 would load the address of the BASR plus 2 into register 12. You will be off by two bytes on every base/displacement address

      2. USING (base address), REGISTER
      does USING directive says assembler to treat particular Register as a base register with the mentioned base address..in the above case * i.e current location counter..well if that is the case why we need BASR R12,R0 ?

      The USING tells the assembler which registers to use when converting symbols to base/displacment addresses. So a symbol like X might be converted to a base/displacement address like C008 (C = Base register 12, displacment = 008). But what happens when the machine executes an instruction with this address? It takes the contents of R12 and adds 008 to get the effective address of X. So at run time it is critical that R12 contains the runtime base address. It is the job of BASR to put the base address in the register at runtime. If it’s not there we won’t find X.

      3. What if I write like
      STM R14,R12,12(R13)
      BASR R12,R0
      LA R11,2048
      LA R11,2048(R11,R12)
      USING *,R12,R11

      there is no address resolution being calculated in both LA statements so is it a right way to set Base register?..will there be any issues with Domain regarding R11 and R12?

      This won’t work because the address of the first LA is loaded by the BASR into R12. But then we later tell the assembler the base address is an address of the first instruction following the USING which occurs further down. When we use R12 in a base/displacement address, we will have the wrong contents in R12.

      You also asked about AMODE and RMODE in a different email. AMODE determines how many bits we will use when computing a base/displacement address – the possibilities are 24, 31, and 64. Very old programs were written with 24 bit addresses. Most programs are written with 31 bit addresses. Very large programs us 64 bit addresses.

      RMODE controls where a program lives in memory:

      RMODE 24 – The control section should be loaded below the 16MB “line”.

      RMODE 31, ANY – The control section should be loaded below the 2GB “bar”, either above or below 16MB

      RMODE 64 – The control section may be loaded anywhere in memory.

      Reply
  18. Les Kelley says:
    December 1, 2016 at 10:10 pm

    I agree with earlier “this is an awesome site” – presentation and training are excellent.
    A couple of points –
    * in many years of MVS systems programming, I’ve lived the “SAVE/RETURN” entry and exit linkages. Partly because it’s usefulness for debugging, and partly from being burned years ago with an inappropriate BALR/SVC-03 usage.
    * Secondly, I think that in the “jumping-into-branches” document the last page has syntactically wrong examples.
    I currently do not have a mainframe to work on, but z390-ASM is excellent, and the results are as I suspected.
    LARL Rx,Ry+offset should be LARL Rx,Address+offset
    or
    LARL Rx,Named-field
    and
    LA Rx,Ry+offset should be LA Rx,offset(,Ry) where offset is < 4096
    X==============X
    000000 (1/7)7 LWK01 CSECT ,
    000000 18CF (1/8)8 LR R12,R15
    000002 (1/9)9 USING LWK01,R12,R11,R10
    000002 C0B00000100C 00100C (1/10)10 LARL R11,R12+4096
    000008 C0A00000100B 00100B (1/11)11 LARL R10,R11+4096
    00000E (1/12)12 ***
    00000E C0B0000007F9 001000 (1/13)13 LARL R11,LWK01+(1*4096)
    000014 C0A000000FF6 002000 (1/14)14 LARL R10,LWK01+(2*4096)
    00001A (1/15)15 ***
    00001A C0B0000007F3 001000 (1/16)16 LARL R11,OFF4096
    000020 C0A000000FF0 002000 (1/17)17 LARL R10,OFF8192

    00003A (1/25)25 ***
    00003A 41B0080C (1/26)26 LA R11,R12+2048
    00003E 41B0080B (1/27)27 LA R11,R11+2048
    000042 41A0080B (1/28)28 LA R10,R11+2048
    000046 41A0080A (1/29)29 LA R10,R10+2048
    00004A (1/30)30 ***
    00004A 41B0C800 (1/31)31 LA R11,2048(,R12)
    00004E 41B0B800 (1/32)32 LA R11,2048(,R11)
    000052 41A0B800 (1/33)33 LA R10,2048(,R11)
    000056 41A0A800 (1/34)34 LA R10,2048(,R10)
    00005A (1/35)35 ***
    X==============X

    Reply
    1. dwoolbright says:
      January 6, 2017 at 10:04 pm

      Sorry, Les, for the long delay in responding. The Christmas vacation has kept me busy and I am just today finding your comment. Thank you for taking time to write – I do appreciate it and depend on all the astute assembler programmers out there for help. Of course, you are absolutely right about the syntax error at the end of the article. I simply dropped the ball. (Punctilious is a goal and not something I have mastered.) I have updated the Jumping Into Branches article to contain what should have been there in the first place. Take a look and see what you think. I am intrigued by your first point … would you mind elaborating a bit? Many thanks – David

      Reply
  19. francesco mazzon says:
    March 8, 2017 at 6:17 am

    ciao from Italy,
    many thanks for your useful website.
    as a joke, could you show briefly how we can code a program using only object code (taken from listing)?
    I mean, maybe in order to “hide” my source, which are the rules to write “90ECD00C” instead of “STM R14,R12,12(R13)”? is there still some part of source I have to write in “clear”? hoping I was clear
    thanks
    francesco

    Reply
    1. dwoolbright says:
      March 8, 2017 at 12:12 pm

      I assume you are asking how to write a program in VisibleZ. You mentioned the object code 90ECD00C which appears on the left side of the listing and which represents a hexadecimal representation of the binary code. To run that in VisibleZ you could create a text file that represented each byte of object code as two characters separated by white space, so 90 EC D0 0C would work. Take a look at some of the code snippets in the Codes directory. I am now supporting the conversion of z390 programs (mainframe emulator) to a VisibleZ format, so you can take certain mainframe programs and convert them to run in VisibleZ.

      Reply
      1. dwoolbright says:
        March 8, 2017 at 11:35 pm

        Francesco,
        Thanks for the comment. If I misunderstood, let me know, and I’ll try again. – David

      2. francesco mazzon says:
        March 9, 2017 at 2:33 am

        Hello David, thank you for your answer. I’m working on a real MF.
        But I think it will work (maybe without blanks in my case).
        In my environment I found program sources like this:
        MAZXTEST CSECT , xx
        MAZXTEST AMODE 31
        MAZXTEST RMODE ANY
        DC X’47F0F01400C3C5C5…. ‘ and lots of DC X’…’ lines until a final END (this in clear!)
        I was wondering if I could write a text file by simply copying from the object code listing or some special behaviour was needed for DSs and DCs.
        thanks gain. francesco

      3. dwoolbright says:
        March 9, 2017 at 5:33 pm

        You might want to code PRINT ON,DATA,GEN at the beginning of the program so you can see all the DS’s and DC’s and what they generate. You will have to account for those. If you can download your program to a PC you can run it through z390 and produce a .390 file that VisibleZ will convert to my text format.

  20. Rahul says:
    May 8, 2017 at 12:44 pm

    Hello, Could you please explain the complete difference between Jump and Branch instructions.

    Reply
  21. Melvyn Maltz says:
    December 10, 2017 at 7:15 pm

    Not sure how to open a new thread here, but this is one

    You would have thought that with over 50 years of Assembler Programming behind me there’s not much more to learn

    New mainframes, new techniques and new versions of HLASM means it’s still a changing world and I have to keep up with the changes

    For those who like a challenge, tell me what the difference is between these two instructions
    LH 1,=X’FFFF’
    LHI 1,X’FFFF’

    Got it yet…

    Ok, apart from the obvious, that LH loads a DC-type from storage and the LHI loads it from an immediate, according to the PoOP manual there is no difference in operation…”the second operand is sign extended and …”

    Well, the LHI is an invalid instruction and won’t assemble…phoo
    Any numeric value in an instruction operand is converted to a 32-bit signed value and as LHI is algebraic, 65535 is out-of-range

    I am working with the HLASM team to resolve this

    Isn’t Assembler life fun 🙂

    If any guys out there would like to have another mentor (sorry David, don’t want to depose you) then feel free to contact me

    zarf99999@blueyonder.co.uk

    And I’ll mention our free Assembler emulator at http://www.z390.org

    Melvyn Maltz.

    Reply
  22. alexdaciuk says:
    November 15, 2018 at 11:57 pm

    Hi!

    I’m learning IBM Assembler for a course at school

    My question is this one, can I use a label as a displacement for a base?

    something like

    CP AUXPACK,DISP(R4)

    Being DISP a labet with the correct size and type? (which I do not know, by the way)

    Thanks!

    Reply
    1. dwoolbright says:
      November 19, 2018 at 6:23 pm

      The displacement is a pure number so you have to use an EQU. For example you could use this:
      DISP EQU 100 or something like
      DISP EQU (HERE-THERE)

      Then you can code this: CP AUXPACK,DISP(R4)

      Reply
    2. dwoolbright says:
      January 7, 2020 at 9:57 pm

      Alex,
      Sorry I missed your post of over a year ago. If you still need a reply, let me know: woolbright_davd@columbusstate.edu
      Sorry,
      David

      Reply
  23. Nunya Bidnez says:
    April 28, 2020 at 4:04 am

    Video 38. SC09 code
    I am reasonably certain that ABEND code is unused.

    Reply
    1. dwoolbright says:
      April 28, 2020 at 5:56 pm

      Try this:
      SRDL R0,63
      DR R0,R0

      Reply
  24. Anubha Agarwal says:
    January 24, 2022 at 4:19 pm

    Hi,

    All your videos are really of great help. I request you to please post a video which can demonstrate the functioning of Search string instruction(SRST). And it will also great after finding the character, verify if searched character is found or not. I would be greatful to you Sir.

    For example – searched for ‘4’ or ‘A’
    XR R0,R0
    LA R5,TABLE
    LA R4,L’TABLE(R5)
    SRST R4,R5
    Check and verify R4 has the value 4 or A or not

    TABLE DC C’1234AB@CD#’

    Reply
    1. dwoolbright says:
      January 25, 2022 at 7:46 pm

      I don’t have a video on this instruction, but I’ll put something together for you. Give me a few days.

      Reply
  25. Bill B says:
    May 5, 2022 at 11:48 pm

    Nice site. Came here looking to refresh my memory on a few things.

    I found a problem in the “General Articles on Programming in Assembler”
    The problem is with 3 and 4
    3) Character Data…is NOT a PDF like most…but a HTML page
    4) Packed Decimal Data…Is the Character Data PDF that probably belongs to number 3. I guessed so pretty sure you wanted number 4 to be a link to “https://punctiliousprogrammer.files.wordpress.com/2017/01/packdata.pdf”…it was a valid URL

    Reply
    1. dwoolbright says:
      May 8, 2022 at 4:56 pm

      Thanks for pointing out the problem with the links. They should look better now.

      Reply
  26. kiran patti says:
    September 17, 2022 at 1:07 am

    Hi, Today, when I clicked on the links.. I am getting below message. “Hmmm… can’t reach this page”

    Reply
    1. dwoolbright says:
      September 17, 2022 at 2:00 pm

      Can you give me a little more information”

      Reply
  27. Gonzalo Mira says:
    September 23, 2022 at 3:48 am

    Hi!

    The link to MVZ under instructions send you to MVN-page.
    I guess that’s not the idea.

    Reply
    1. dwoolbright says:
      September 23, 2022 at 10:41 am

      Thanks. I’ll fix that right now.

      Reply
  28. Gonzalo Mira says:
    June 13, 2023 at 8:51 am

    Hi!
    Link To instruction TP –> show TM
    Link To instruction TR –> Not found

    Reply
    1. dwoolbright says:
      June 16, 2023 at 6:30 pm

      Thanks. The links should be good now.

      Reply
  29. Gonzalo Mira says:
    June 13, 2023 at 8:54 am

    Hi!

    The link to TP under instructios send you to TM.
    And link to TR is not found

    Reply
    1. dwoolbright says:
      June 16, 2023 at 6:29 pm

      The links should be repaired now. Thanks for letting me know!

      Reply
  30. Hemanth says:
    July 6, 2023 at 12:49 am

    Hello,

    Firstly, this is a great website for HLASM. Thanks for everything you do here. I purchased your book and eagerly waiting for it to be delivered.

    I have not worked on assembler on the mainframe. But I have been going through assembler programs to understand and possibly mimic the functionality if needed in the target environment.

    Recently, I started working on TPF. I see that TPF is a lot like HLASM but it has different code snippets like COBOL (For example, IF ELSE blocks). A search on internet didn’t give me resources like this website. Can you point me to any resources that you are aware of to learn TPF?

    Reply
    1. dwoolbright says:
      July 11, 2023 at 10:29 am

      I’m not aware of any resources for TPF, but perhaps one of our readers can post some suggestions as comments?

      Reply
    2. dwoolbright says:
      July 11, 2023 at 10:39 am

      I’m not familiar with TPF, but it occurred to me that the IF ELSE blocks you are seeing there might be macros. IBM supplies IF-ELSE macros for assembler as well. IF you look back through the Posts on this site, you will find some that are labeled “Structured Assembler Macros” that discusses this for HLASM.

      Reply
  31. Ankit says:
    July 31, 2023 at 6:39 am

    Hi Sir,
    My name is Ankit, I’m working for one company that works on Mainframe and they ask me to learn Assembly language. Can you please explain the future of this language, it’s too old and i am not able to gain interest to learn this. I don’t know do i need to learn this or not or i have to switch for another technology. Sorry but i have too much confusion. hope you understand.

    Reply
    1. dwoolbright says:
      July 31, 2023 at 4:34 pm

      Hi Ankit,
      IBM mainframe assembler has been around since the early 1960’s. The IBM 360 started with a few hundred instructions. With each new machine the company has added more instructions. The latest machines have 2000+ instructions. The machine has remained backward-compatible for over sixty years. If you are planning a mainframe career, there is no better training than learning assembler. It underpins everything – even COBOL. It does take time to become proficient, but you can be productive in a few months by working hard. Assembler will be used far into the future, so if you want to invest in something that won’t disappear in the next few years, this is a good choice. In the mainframe world, assembly language programming is a skill that will get you looked at.
      On the other hand, if you aren’t planning to keep working for a mainframe company, you might be better off learning other skills. It sort of depends on the direction you want your career to take. If your company wants you to learn assembler, they must think highly of you.
      David

      Reply
  32. subhash rajak says:
    August 25, 2023 at 3:23 pm

    Hi David,
    Your website is perfect for learning ASM.
    In the MH instruction example, I observed that the 2nd operand is mentioned as =F’10’ instead of =H’10’.

    Thanks
    Subhash

    Reply
    1. dwoolbright says:
      August 27, 2023 at 3:59 pm

      Thanks, I’ll get it corrected.

      Reply
  33. Dave says:
    October 25, 2023 at 2:29 pm

    Hi you mentioned a possible sequel to the big blue assembler book (which I own and love), are there any dates yet for its release?

    Reply
    1. dwoolbright says:
      October 31, 2023 at 1:01 am

      I’m trying to finish a sequel to my first novel- a mystery. The new one is called Death of a Golden Bird. I’m teaching for Marist again at the end of November, so I’ll be doing assembler everyday again soon.

      Reply
      1. Dave2 says:
        September 12, 2024 at 1:29 pm

        Hi David
        Will you be covering assembler instructions like AGO & AIF and how they are used?

      2. dwoolbright says:
        September 12, 2024 at 11:46 pm

        I haven’t written about AGO and AIF. Perhaps that would be a good short topic for an article.

      3. dwoolbright says:
        September 15, 2024 at 5:00 pm

        It turns out I have written about AGO and AIF, and somehow the work was lost in the pile. I am going to post about this and make it available in the Video Course Link – at the bottom.

      4. dwoolbright says:
        September 15, 2024 at 5:00 pm

        It turns out I have written about AGO and AIF, and somehow the work was lost in the pile. I am going to post about this and make it available in the Video Course Link – at the bottom.

  34. subhash says:
    April 18, 2024 at 11:52 am

    Hi Dave,
    Hope you are doing good. I have one observation. Could you please have a look.

    AFIELD DC H’4’ AFIELD = X’0004’
    BFIELD DC H’-1’ BFIELD = X’FFFF’
    CFIELD DC H’0’ CFIELD = X’0000’

    LH R4,AFIELD R4 = X’00000004’
    LH R4,BFIELD R4 = X’FFFFFFFF’
    LH R4,CFIELD R4 = X’00000000’
    LH R4,DFIELD R4 = X’FFFF

    CONSIDER THE NEXT TWO CONSECUTIVELY EXECUTED LOADS
    LH R5,AFIELD R5 = X’00000004’
    LH R6,AFIELD(R5) R6 = X’FFFFFFFF’ => This field should have x’00000000′

    Thanks
    Subhash

    Reply
    1. dwoolbright says:
      April 21, 2024 at 11:26 pm

      Subhash, With index register R5 containing x’00000004′, AFIELD(R5) is the address of BFIELD. Do you agree?

      Reply
  35. subhash says:
    April 23, 2024 at 11:42 am

    Hi Dave,
    AFIELD,BFIELD and CFIELD are defined as halfword that means AFIELD(R5) should point to CFIELD.

    Thanks
    Subhash

    Reply
    1. dwoolbright says:
      April 24, 2024 at 12:38 am

      You’re right!

      Reply
  36. Dave2 says:
    September 12, 2024 at 1:25 pm

    Hi Dave

    I am relearning Assembler after a long break, I love the Big blue book great for what I am trying to do. Are you going to cover conditional assembler instructions like AGO AIF etc and how to use them?

    Reply
  37. Nunya Bidnez says:
    September 17, 2024 at 4:52 am

    A correction to the unearthed macro segment: https://punctiliousprogrammer.com/wp-content/uploads/2020/04/condasmmacros.mp4

    ago statements can branch not only to anop but also to aif

    Reply
    1. dwoolbright says:
      September 17, 2024 at 6:12 am

      Good point! Thank you.

      Reply
  38. Paul Newton says:
    October 2, 2024 at 10:47 am

    David, I always refer educators wanting to teach Z arch assembler to your website and “The Big Blue Assembler Book” as I did yesterday. Approximately, 5+ years ago while at SHARE, a highly experienced IBM Z IT professional complained Z arch assembler teaching material was non-existent. I immediately responded, “Are you aware of Dr. David Woolbright contributions to learning Z arch assembler on the public internet?”

    Reply
    1. dwoolbright says:
      October 16, 2024 at 3:25 pm

      Thanks, Paul. I owe you so much for the knowledge and effort you have shared over so many years!

      Reply
  39. Shekhar says:
    February 18, 2025 at 4:28 pm

    Hi David,

    Thanks you for the simplified and detailed explanations of HLASM instructions. Its a good starting point if you don’t know anything about HLASM programing as well as the experienced professionals.

    FYI.. The links are broken or don’t point to right place for the following instructions.
    1. AGFI –> Video link point to AGF
    2. BAS –> Video link point to AR
    3. BCTR –> Video link point to BCT
    4. LAY –> Video link point to LA
    5. O –> Video link point to OR
    6. OC –>Video link point to OR
    7. XR –> Video link point to PDF document of OR

    Video link point to PDF document
    OI, OR, PACK, S, SLA, SLDA, SLDL, SLL, SPM, SRA, SRDA, SRDL, SRL, SRST, ST, STC, STH, STOC, STM, TM, TP, TR, TRT, UNPK, X, XC, XI, ZAP

    Broken Link “Page not found”
    CVD, , M, MP, MH, MR, MVC, MVCL, MVI, MVN, MVZ, N, SRP

    NO VIDEO Link Found for following
    STY, SH, SP, SY

    No Document Links Found for following
    STM, STY, SH, SP, SY

    Reply
    1. dwoolbright says:
      February 18, 2025 at 5:03 pm

      Thanks very much, Shekhar. I’m not sure what has happened, but I will fix the links tonight.
      David

      Reply
    2. dwoolbright says:
      February 20, 2025 at 12:50 am

      I am still working on fixing the links. Most are repaired now, but I am chasing down some missing videos.
      David

      Reply
    3. dwoolbright says:
      February 20, 2025 at 10:53 am

      Shekhar, I have updated the links. Some I had to remove. but I will work on rebuilding the videos and adding to the site. Many thanks. If you spot another bad link, let me know.
      David

      Reply
  40. Alex B says:
    April 18, 2025 at 5:39 pm

    Hello David – currently working on training some new hires at our company on all things IBM mainframe. And wanted to leave a note that these videos and instruction overviews have been extremely helpful throughout the assembler training process. Thanks for all the work you’ve put into this site – hope all is well!

    Reply
    1. dwoolbright says:
      April 21, 2025 at 5:28 am

      Thanks so much, Alex!
      – David

      Reply
  41. Mike D says:
    April 25, 2025 at 11:43 am

    Hi David, you taught me Assembler many years ago, I am still working in it today. I find your site very useful when I have to refresh myself on exactly how an instruction works while reviewing old code. I did find an error in your MVC PDF, it is a small one, your 3rd example shows FieldA with 4 bytes when it is defined with 3.

    Reply
    1. dwoolbright says:
      May 16, 2025 at 8:50 am

      Mike,
      Sorry for the delay in responding. Thank you for taking the time to send me the correction. I repaired it on the site. It’s so gratifying to hear you are working in assembler. All that work years ago has paid off! If I can help you in any way, I’m still coding for fun.
      David

      Reply
  42. James McGee says:
    May 6, 2025 at 11:40 am

    Dr Woolbright, I was asked about Section 14 macros today. I have never heard of them. Do you have or can you point me to any references so as to be able to understand what benefits they might be to me in HLAS development?

    Reply
    1. dwoolbright says:
      May 16, 2025 at 8:55 am

      James,
      Sorry for the delay in responding. There are a couple of videos on the website that cover an introduction to macros. I’m not sure what you mean by Section 14 macros. Here are the links I have: https://punctiliousprogrammer.com/wp-content/uploads/2020/04/macros.mp4 https://punctiliousprogrammer.com/wp-content/uploads/2020/04/macrolecture2.mp4

      Hope these help,
      David

      Reply
  43. Douglas Assumpção Rodrigues says:
    May 15, 2025 at 10:17 pm

    Hi Daivid, I’m from Brazil and I’m trying to learn HLASM on my own when I found your website! It changed my self-learning forever! Thank you for your amazing work!
    You are a true doctor of teaching!

    Reply
    1. dwoolbright says:
      May 16, 2025 at 8:58 am

      Douglas,
      Thanks for the vote of confidence and for taking the time to write. I’m happy the site helped in some way. I’m always here if I can help.
      David

      Reply
  44. Mike says:
    June 6, 2025 at 8:51 am

    Hi David,
    I was looking at your XC documentation, the instructions you have to clear a field at bottom are incorrect, you have 2 MVIs it could confuse some people.

    Reply
    1. dwoolbright says:
      June 9, 2025 at 10:58 pm

      Mike,
      Thank you for pointing out my error and taking the time to write me about it. I changed the MVI/MVI to MVI/MVC on the website. I assume that is the correction you were suggesting. I depend on readers like you to keep me straight.
      Thank you, David

      Reply
  45. Pingback: The big free mainframe curriculum - EXECPGM
  46. Anthony says:
    August 23, 2025 at 3:54 pm

    Hi David,
    Would it be possible to do a section on Boundary Alignment?

    Regards,

    Anthony Musses

    Reply
    1. dwoolbright says:
      August 23, 2025 at 9:38 pm

      I can do that.

      Reply
      1. Anthony Musses says:
        August 24, 2025 at 3:53 am

        Thank you!

Leave a Reply to BobCancel reply

Calendar

January 2026
M T W T F S S
 1234
567891011
12131415161718
19202122232425
262728293031  
« Nov    

Categories

  • Fans of IBM z
  • IBM Champion
  • IBM DB2
  • IBM Enterprise Cobol
  • IBM Mainframe Assembler
  • My Books
  • VSAM

Search

Meta

  • Log in

Advance Training Academy WordPress Theme By Themeshopy