Chapter 6 Programming the LC-3

Similar documents
CS 135: Computer Architecture I

11/10/2016. Review the Problem to Be Solved. ECE 120: Introduction to Computing. What Shall We Keep in the Registers? Where Are the Pieces in Memory?

LC-3 Instruction Set Architecture

Introduction to Computer Engineering. Chapter 5 The LC-3. Instruction Set Architecture

Instruction Set Architecture

Chapter 5 The LC-3. ACKNOWLEDGEMENT: This lecture uses slides prepared by Gregory T. Byrd, North Carolina State University 5-2

Chapter 5 - ISA. 1.The Von Neumann Model. The Stored Program Computer. Von Neumann Model. Memory

Computing Layers. Chapter 5 The LC-3

Introduction to Computer Engineering. CS/ECE 252, Fall 2016 Prof. Guri Sohi Computer Sciences Department University of Wisconsin Madison

LC-3 Instruction Set Architecture. Textbook Chapter 5

Introduction to Computer Engineering. CS/ECE 252, Spring 2017 Rahul Nayar Computer Sciences Department University of Wisconsin Madison

Copyright The McGraw-Hill Companies, Inc. Permission required for reproduction or display. Computing Layers

COSC121: Computer Systems: Review

EEL 5722C Field-Programmable Gate Array Design

COSC121: Computer Systems: Review

Chapter 7 Assembly Language. ACKNOWLEDGEMENT: This lecture uses slides prepared by Gregory T. Byrd, North Carolina State University

Assembly Language. University of Texas at Austin CS310H - Computer Organization Spring 2010 Don Fussell

Chapter 7 Assembly Language

Computing Layers. Chapter 7 Assembly Language

Introduction to Computer Engineering. CS/ECE 252, Fall 2016 Prof. Guri Sohi Computer Sciences Department University of Wisconsin Madison

Introduction to Computer Engineering. CS/ECE 252, Spring 2017 Rahul Nayar Computer Sciences Department University of Wisconsin Madison

Register Files. Single Bus Architecture. Register Files. Single Bus Processor. Term Project: using VHDL. Accumulator based architecture

ECE 206, Fall 2001: Lab 3

Assembly Language. 7.1 Assembly Language Programming Moving Up o Level. chapter

Load -- read data from memory to register. Store -- write data from register to memory. Load effective address -- compute address, save in register

Midterm 2 Review Chapters 4-16 LC-3

Introduction to Computer. Chapter 5 The LC-3. Instruction Set Architecture

Chapter 10 And, Finally... The Stack. ACKNOWLEDGEMENT: This lecture uses slides prepared by Gregory T. Byrd, North Carolina State University

11/6/2016. Let s Solve a Problem. ECE 120: Introduction to Computing. Overview of Our Task. Programs are Finite State Machines

appendix a The LC-3 ISA A.1 Overview

Memory Usage in Programs

Assembly Language. 7.1 Assembly Language Programming Moving Up o Level. chapter

LC-3 ISA - II. Lecture Topics. Lecture materials. Homework. Machine problem. Announcements. ECE 190 Lecture 10 February 17, 2011

LC-3 Assembly Language

Ch. 5: The LC-3. PC-Relative Addressing Mode. Data Movement Instructions. James Goodman!

Chapter 9 TRAP Routines and Subroutines

Chapter 9 TRAP Routines and Subroutines

Trap Vector Table. Interrupt Vector Table. Operating System and Supervisor Stack. Available for User Programs. Device Register Addresses

CS/ECE 252: INTRODUCTION TO COMPUTER ENGINEERING COMPUTER SCIENCES DEPARTMENT UNIVERSITY OF WISCONSIN-MADISON

ADD R3, R4, #5 LDR R3, R4, #5

Intro. to Computer Architecture Homework 4 CSE 240 Autumn 2005 DUE: Mon. 10 October 2005

System Calls. Chapter 9 TRAP Routines and Subroutines

20/08/14. Computer Systems 1. Instruction Processing: FETCH. Instruction Processing: DECODE

CIT 593: Intro to Computer Systems Homework #4: Assembly Language Due October 18, 2012, 4:30pm. Name

CS 2461: Computer Architecture I

TRAPs and Subroutines. University of Texas at Austin CS310H - Computer Organization Spring 2010 Don Fussell

Introduction to Computer Engineering. CS/ECE 252, Spring 2017 Rahul Nayar Computer Sciences Department University of Wisconsin Madison

ECE/CS 252: INTRODUCTION TO COMPUTER ENGINEERING UNIVERSITY OF WISCONSIN MADISON

Homework 06. Push Z Push Y Pop Y Push X Pop X Push W Push V Pop V Push U Pop U Pop W Pop Z Push T Push S

Chapter 10 And, Finally... The Stack

Chapter 13 Control Structures

Syntax of LC-3 assembly: Language elements. Instructions

10/31/2016. The LC-3 ISA Has Three Kinds of Opcodes. ECE 120: Introduction to Computing. ADD and AND Have Two Addressing Modes

Subroutines & Traps. Announcements. New due date for assignment 2 5pm Wednesday, 5May

CS/ECE 252: INTRODUCTION TO COMPUTER ENGINEERING UNIVERSITY OF WISCONSIN MADISON

University of Illinois at Urbana-Champaign First Midterm Exam, ECE 220 Honors Section

CS/ECE 252: INTRODUCTION TO COMPUTER ENGINEERING UNIVERSITY OF WISCONSIN MADISON

CS/ECE 252: INTRODUCTION TO COMPUTER ENGINEERING UNIVERSITY OF WISCONSIN MADISON. Instructor: Rahul Nayar TAs: Mohit Verma, Annie Lin

Chapter 8 I/O. Copyright The McGraw-Hill Companies, Inc. Permission required for reproduction or display. But where does data in memory come from?

CS/ECE 252: INTRODUCTION TO COMPUTER ENGINEERING UNIVERSITY OF WISCONSIN MADISON

CS/ECE 252: INTRODUCTION TO COMPUTER ENGINEERING UNIVERSITY OF WISCONSIN MADISON

CS/ECE 252: INTRODUCTION TO COMPUTER ENGINEERING UNIVERSITY OF WISCONSIN MADISON

Problem Solving in C. Stepwise Refinement. ...but can stop refining at a higher level of abstraction. Same basic constructs. as covered in Chapter 6

The LC-3 Instruction Set Architecture. ISA Overview Operate instructions Data Movement instructions Control Instructions LC-3 data path

Assembly: Review. Computer Science and Engineering College of Engineering The Ohio State University. Lecture 14

Chapter 13. Control Structures

Chapter 9 TRAP Routines and Subroutines

ECE 109 Sections 602 to 605 Final exam Fall December, 2007

Chapter 12 Variables and Operators

CIT 595 Spring System Software: Programming Tools. Assembly Process Example: First Pass. Assembly Process Example: Second Pass.

Review Topics. Midterm Exam Review Slides

1/30/2018. Conventions Provide Implicit Information. ECE 220: Computer Systems & Programming. Arithmetic with Trees is Unambiguous

ECE198KL: Introduction to Computer Engineering II Spring 2013 due: 10 p.m. on Monday 21 January. Printing a Histogram

LC-3 Subroutines and Traps. (Textbook Chapter 9)"

Review Topics. Midterm Exam Review Slides

11/16/2016. Review Our Process for Programming. ECE 120: Introduction to Computing. A Typical Programming Process. Can a Computer Help Us Program?

UNIVERSITY OF WISCONSIN MADISON

Chapter 13 Control Structures

Control Structures II. Repetition (Loops)

Introduction to Computer Engineering. CS/ECE 252, Fall 2012 Prof. Guri Sohi Computer Sciences Department University of Wisconsin Madison

CS61C Machine Structures. Lecture 4 C Pointers and Arrays. 1/25/2006 John Wawrzynek. www-inst.eecs.berkeley.edu/~cs61c/

Lab 1. Warm-up : discovering the target machine, LC-3

LC-3 TRAP Routines. Textbook Chapter 9

CPSC 213. Introduction to Computer Systems. Static Scalars and Arrays. Unit 1b

The MARIE Architecture

Guide to Using the Unix version of the LC-2 Simulator

ENGN1640: Design of Computing Systems Topic 03: Instruction Set Architecture Design

CS 241 Data Organization Binary

Implementing Functions at the Machine Level

LC-3 Assembly Language. (Textbook Chapter 7)"

Computer Systems Architecture I. CSE 560M Lecture 3 Prof. Patrick Crowley

2.2 THE MARIE Instruction Set Architecture

Outline. Program development cycle. Algorithms development and representation. Examples.

ECE 411 Exam 1. This exam has 5 problems. Make sure you have a complete exam before you begin.

Wednesday, February 7, 2018

ECE/CS 252: INTRODUCTION TO COMPUTER ENGINEERING UNIVERSITY OF WISCONSIN MADISON

CHAPTER 2 PROBLEM SOLVING TECHNIQUES. Mr Mohd Hatta Bin Hj Mohamed Ali Computer Programming BFC2042

are Softw Instruction Set Architecture Microarchitecture are rdw

1/17/2018. Task: Print a Number in Binary. ECE 220: Computer Systems & Programming. First Step: Break the Task into a Sequence of Two

9/23/2013. Chapter 2. Objectives. Introduction. Objectives (continued) Representing Algorithms. Representing Algorithms

Transcription:

Chapter 6 Programming the LC-3 Based on slides McGraw-Hill Additional material 4/5 Lewis/Martin Aside: Booting the Computer How does it all begin? We have LC-3 hardware and a program, but what next? Initial state of computer All zeros (registers, memory, condition codes) Only mostly true Boot process Load boot code held in ROM (read-only memory) BIOS (basic input/output system) Loads operating system from disk (or other input device) Operating systems loads other programs Uses memory operations (loads, stores) Sets to beginning of program to run it Programs invoke O.S. using TRAP instructions 6- Aside: Copying BIOS into Memory clock 6 6 C + A in 6 by 6 bit ROM 6 D in D out A in WE 6 by 6 bit memory BIOS Main Memory Solving Problems using a Computer Methodologies for creating computer programs that perform a desired function Problem Solving How do we figure out what to tell the computer to do? Convert problem statement into algorithm (stepwise refinement) Convert algorithm into LC-3 machine instructions Debugging How do we figure out why it didn t work? Examining registers and memory, setting breakpoints, etc. Time spent on the first can reduce time spent on the second! 6-3 6-4

Stepwise Refinement Problem Statement Also known as systematic decomposition Start with problem statement: We wish to count the number of occurrences of a character in a file. The character in question is to be input from the keyboard; the result is to be displayed on the monitor. Because problem statements are written in English, they are sometimes ambiguous and/or incomplete Where is the data located? How big is it, or how do I know when I ve reached the end? How should final count be printed? A decimal number? If the character is a letter, should I count both upper-case and lower-case occurrences? Decompose task into a few simpler subtasks Decompose each subtask into smaller subtasks, and these into even smaller subtasks, etc... until you get to the machine instruction level How do you resolve these issues? Ask the person who wants the problem solved, or Make a decision and document it 6-5 6-6 Three Basic Constructs Programming at the Instruction Level There are three basic ways to decompose a task: Advantage: can do anything General, powerful Task Disadvantage: can do anything Difficult to structure, modify, understand Mitigate disadvantages using structured programming Test condition Test condition Use familiar constructs (even at the instruction level) From Java/C/Pascal/Fortran/Basic Iteration (while loop, for loop) Conditional (if statement, switch/case statement) Sequential Conditional Iterative 6-7 6-8

Sequential Do to completion, then do to completion, etc. Conditional If condition is true, do ; else, do Get character input from keyboard file char = input? Count and print the occurrences of a character in a file Examine file and count the number of characters that match Test character. If match, increment counter. Count = Count + Print number to the screen 6-9 6- Iterative Do over and over, as long as the test condition is true Problem Solving Skills Learn to convert problem statement into step-by-step description of subtasks Check each element of the file and count the characters that match. more chars to check? Check next char and count if matches. Like a puzzle, or a word problem from grammar school math What is the starting state of the system? What is the desired ending state? How do we move from one state to another? Recognize English words that correlate to three basic constructs: do A then do B sequential if G, then do H conditional for each X, do Y iterative do Z until W iterative 6-6- 3

LC-3 Control Instructions Code for Conditional How can instructions encode these basic constructs? Sequential Instructions naturally flow from one to next, so no special instruction needed to go from one sequential subtask to next Test Condition Exact bits depend on condition being tested A B Instruction Generate Condition? C offset to address C Conditional and Iterative Create code that converts condition into N, Z, or P Condition: Is R = R? Code: Subtract R from R; if equal, Z bit will be set Use BR instruction to transfer control What about R < R? Code: Subtract R from R (R-R), if less, N bit will be set 6-3 Next Unconditional branch to Next C D D Next Assuming all addresses are close enough that -relative branch can be used offset to address D 6-4 Code for Iteration Test Condition Next Exact bits depend on condition being tested Unconditional branch to retest condition A B C Instruction Generate Condition? C A Next Assuming all addresses are close enough that -relative branch can be used offset to address C offset to address A 6-5 Example (from both Ch 5 and 6) Count the occurrences of a character in a file Program begins at location x3 Read character from keyboard Load each character from a file In this example the file is already in sequence of memory locations Starting address of file is stored in the memory location immediately after the program If file character equals input character, increment counter End of file is indicated by a special ASCII value: EOT (x4) At the end, print the number of characters and halt (assume there will be fewer than occurrences of the character) A special character used to indicate the end of a sequence is often called a sentinel Useful when you don t know ahead of time how many times to execute a loop 6-6 4

Example: Counting Characters START Refining B START A Initialize: Put initial values into all locations that will be needed to carry out this task. B Input a character. Then scan a file, counting occurrences of that character. Finally, display on the monitor the number of occurrences of the character (up to 9). STOP B - Input a character. - Set up a pointer to the first location of the file that will be scanned. - Get the first character from the file. - Zero the register that holds the count. Scan the file, location by location, incrementing the counter if the character matches. B Scan the file, location by location, incrementing the counter if the character matches. B Test character. If a match, increment counter. Get next character. Initial refinement: Big task into three sequential subtasks. C Display the count on the monitor. STOP 6-7 Refining B into iterative construct. 6-8 Refining B Refining B and B3 B B B Test character. If a match, increment counter. Get next character. B B Test character. If matches, increment counter. B3 Get next character. B B Test character. If matches, increment counter. B3 Get next character. R = R? R = R + B3 R3 = R3 + R = M[R3] Refining B into sequential subtasks. Conditional (B) and sequential (B3). Use of LC-3 registers and instructions. 6-9 6-5

Entire Flow Chart Input: M[x3] (address of file ) Output: Print count to display Count = (R = ) Ptr = st file character (R3 = M[x3]) Input char from keybd (TRAP x3) Load char from file (R = M[R3]) Incr Count (R = R + ) (R?= EOT) Match? (R?= R) Load next char from file (R3 = R3 +, R = M[R3]) Convert count to ASCII character (R = x3, R = R + R) Print count (TRAP x) (TRAP x5) Translate to Pseudocode R (Count) R3 M[x3] (Ptr) Input to R (TRAP x3) Count = (R = ) Ptr = st file character (R3 = M[x3]) Input char from keybd (TRAP x3) Load char from file (R = M[R3]) Incr Count (R = R + ) (R?= EOT) Match? (R?= R) Load next char from file (R3 = R3 +, R = M[R3]) Convert count to ASCII character (R = x3, R = R + R) Print count (TRAP x) (TRAP x5) R4 R 4 (EOT) BRz x???? R T R R R + R R + R BRnp x????? R R + R3 R3 + BRnzp x???? R M[x33] R R + R Print R (TRAP x) (TRAP x5) 6-6- Iterative Construct in Pseudocode R (Count) R3 M[x3] (Ptr) Input to R (TRAP x3) Count = (R = ) Ptr = st file character (R3 = M[x3]) Input char from keybd (TRAP x3) Load char from file (R = M[R3]) Incr Count (R = R + ) (R?= EOT) Match? (R?= R) Load next char from file (R3 = R3 +, R = M[R3]) Convert count to ASCII character (R = x3, R = R + R) Print count (TRAP x) (TRAP x5) R4 R 4 (EOT) BRz x???? R T R R R + R R + R BRnp x????? R R + R3 R3 + BRnzp x???? R M[x33] R R + R Print R (TRAP x) (TRAP x5) Conditional in Pseudocode R (Count) R3 M[x3] (Ptr) Input to R (TRAP x3) Count = (R = ) Ptr = st file character (R3 = M[x3]) Input char from keybd (TRAP x3) Load char from file (R = M[R3]) Incr Count (R = R + ) (R?= EOT) Match? (R?= R) Load next char from file (R3 = R3 +, R = M[R3]) Convert count to ASCII character (R = x3, R = R + R) Print count (TRAP x) (TRAP x5) R4 R 4 (EOT) BRz x???? R T R R R + R R + R BRnp x???? R R + R3 R3 + BRnzp x???? R M[x33] R R + R Print R (TRAP x) (TRAP x5) 6-3 6-4 6

Final Pseudocode R (Count) R3 M[x3] (Ptr) Input to R (TRAP x3) Count = (R = ) Ptr = st file character (R3 = M[x3]) Input char from keybd (TRAP x3) Load char from file (R = M[R3]) Incr Count (R = R + ) (R?= EOT) Match? (R?= R) Load next char from file (R3 = R3 +, R = M[R3]) Convert count to ASCII character (R = x3, R = R + R) Print count (TRAP x) (TRAP x5) Don t know offset bits until all the code is done R4 R 4 (EOT) BRz x???? R T R R R + R R + R BRnp x???? R R + R3 R3 + BRnzp x???? R M[x33] R R + R Print R (TRAP x) (TRAP x5) 6-5 Translate Pseudocode ( of ) Address Instruction x3 x3 x3 x33 x34 x35 x36 X38 x39 BR ADD LD AND TRAP Comments R (counter) R3 M[x3] (ptr) Input to R (TRAP x3) R4 R 4 (EOT) BRz x3e R T R R R + R R + R BRnp x3b 6-6 BR Translate Pseudocode ( of ) Address Instruction x3a x3b x3c ADD LD AND TRAP Comments R R + R3 R3 + Structured Programming of LC-3 Summary Decompose task Top-down Specification often ambiguous Continual refinement of details x3d x3e x3f x3 x3 BRnzp x34 R M[x33] R R + R Print R (TRAP x) (TRAP x5) Write code Top-down or bottom-up Focus on one bite-sized part at a time Use structured programming (even at the instruction level) Translate flowchart to pseudo code then to machine code X3 x33 Starting Address of File ASCII x3 ( ) Continual testing and debugging of code 6-7 6-8 7

Debugging You ve written your program and it doesn t work w what? What do you do when you re lost in a city? Drive around randomly and hope you find it? Return to a known point and look at a map? In debugging, the equivalent to looking at a map is tracing your program Examine the sequence of instructions being executed Keep track of results being produced Compare result from each instruction to the expected result Debugging Operations Any debugging environment might provide means to:. Display values in memory and registers. Deposit values in memory and registers 3. Execute instruction sequence in a program 4. Stop execution when desired Different programming levels offer different tools High-level languages (C, Java,...) have source-code debugging tools For debugging at the machine instruction level: Simulators Operating system monitor tools Special hardware 6-9 6-3 LC-3 Simulator Start Execution Command Line Mem/Reg Valus Stop Execution Types of Errors Syntax Errors Typing error that resulted in an illegal operation Machine language: not caught, because almost any bit pattern corresponds to some legal instruction High-level language: caught during the translation from language to machine code Logic Errors Program is legal, but wrong, so the results don t match the problem statement Trace the program to see what s really happening and determine how to get the proper behavior Data Errors Input data is different than what you expected Test the program with a wide variety of inputs 6-3 6-3 8

Tracing the Program Execute the program one piece at a time, examining register and memory to see results at each step Single-Stepping Execute one instruction at a time Tedious, but useful to help you verify each step of your program Breakpoints Tell the simulator to stop executing when it reaches a specific instruction Check overall results at specific points in the program Lets you quickly execute sequences to get a high-level overview of the execution behavior Quickly execute sequences that your believe are correct 6-33 Example : Multiply Goal: Multiply the two unsigned integers in R4 and R5, and place result in R clear R add R4 to R decrement R5 R5 =? x3 x3 x3 x33 x34 Set R4 =, R5 =3 Run program Result: R = 4, not 3 (R = x8, not xe) 6-34 Example : Multiply Goal: Multiply the two unsigned integers in R4 and R5, and place result in R clear R add R4 to R decrement R5 R5 =? x3 AND R,R,# x3 ADD R,R,R4 x3 ADD R5,R5,#- x33 BRzp x3 x34 Set R4 =, R5 =3 Run program Result: R = 4, not 3 (R = x8, not xe) 6-35 Debugging the Multiply Program and registers at the beginning of each instruction x3 x3 x3 x33 x3 x3 x33 x3 x3 x33 x3 x3 x33 x34 R 3 3 3 4 4 4 4 R4 R5 3 3 3 - - - Single-stepping Breakpoint at branch (x33) x33 x33 x33 x33 R 3 4 4 R4 R5 Executing loop one time too many Branch at x33 should be based on Z bit only, not Z and P (change x7fd to x3fd) 6-36 - - Should stop looping here! 9

Example : Summing an Array of Numbers Goal: Sum the numbers stored in memory locations beginning with x3, leaving the result in R R = R4 = R = x3 R = R + M[R] R = R + R4 = R4 - R4 =? x3 AND x3 AND x3 ADD x33 LD x34 LDR x35 ADD x36 ADD ADD x38 BRp x39 R,R,# R4,R4,# R4,R4,# R,x3 R3,R,# R,R,# R,R,R3 R4,R4,#- x34 6-37 Debugging the Summing Program Running the data below yields R = x4, but the sum should be x835. What happened? Address x3 x3 x3 x33 x34 x35 x36 x37 x38 x39 Contents x37 x89 x x3 x x xb x9 x7 x4 Start single-stepping program... x3 x3 x3 x33 x34 R R x37 R4 Should be x3! Loading contents of M[x3], not address Change opcode of x33 from (LD) to xe or (LEA) 6-38 Example 3: Looking for a 5 Scan ten memory locations starting at x3 If a 5 is found set R to, otherwise set R to R3 =? R = R =, R = -5, R3 = R4 = x3, R = M[R4] R = 5? R4 = R4 + R3 = R3- R = M[R4] x3 AND R,R,# x3 ADD R,R,# x3 AND R,R,# x33 ADD R,R,#-5 x34 AND R3,R3,# x35 ADD R3,R3,# x36 LD R4,x3 LDR R,R4,# x38 ADD R,R,R x39 BRz x3f x3a ADD R4,R4,# x3b ADD R3,R3,#- x3c LDR R,R4,# x3d BRp x38 x3e AND R,R,# x3f X3 x3 6-39 Debugging the Fives Program Running the program with a 5 in location x38 results is R =, not R =. What happened? Address x3 x3 x3 x33 x34 x35 x36 x37 x38 x39 Contents 9 7 3-8 9 6 3 5 6 Perhaps we didn t look at all the data? Put a breakpoint at x3d to see how many times we branch back x3d x3d R R 7 3 R3 9 8 R4 x3 x3 x3d 7 x33 7 x33 Didn t branch back, even though R3 >? Branch uses condition code set by loading R with M[R4], not by decrementing R3. Swap x3b and x3c, or remove x3c and branch back to 6-4

Example 4: Finding First in a Word Goal: Return (in R) the bit position of the first in a word; address of word is in location x39 (just past the end of the program); if there are no ones, R should be set to R = 5 R = data R[5] =? decrement R shift R left one bit R[5] =? x3 AND R,R,# x3 ADD R,R,#5 x3 LDI R,x39 x33 BRn x38 x34 ADD R,R,#- x35 ADD R,R,R x36 BRn x38 BRnzp x34 x38 x39 x3 6-4 Shifting Left We often want to manipulate individual bits Example: is a number odd or even? Answer: R := R AND x If R is -> R was even If R is -> R was odd LC-3 doesn t give us an instruction to shift bits Most ISAs include shift left and shift right Example: If you shift left one place, results How do we shift left in LC-3? Multiple value by (why?) Same as R := R + R Example: + = Adding a value to itself shifts the bits left one place 6-4 Debugging the First-One Program Program works most of the time, but if data is zero, it never seems to Breakpoint at backwards branch () R 4 3 9 8 7 6 5 R 4 3 - - -3-4 -5 If no ones, then branch to never occurs! This is called an infinite loop. Must change algorithm to either (a) check for special case (R=), or (b) exit loop if R <. Debugging: Lessons Learned Trace program to see what s going on Breakpoints, single-stepping When tracing, make sure to notice what s really happening, not what you think should happen In summing program, it would be easy to not notice that address x37 was loaded instead of x3 Test your program using a variety of input data In Examples 3 and 4, the program works for many data sets Be sure to test extreme cases (all ones, no ones,...) 6-43 6-44