// multiply_two_sums.iml (c) 1997 - 2000 Kari Laitinen // This program uses four constants and calculates the result // of the following arithmetic formula: // // ( first_number + second_number ) * ( third_number + fourth_number ) // beginning_of_main_program: set_memory_pointer first_number load_register_a_from_memory set_memory_pointer second_number load_register_b_from_memory add_register_b_to_a set_memory_pointer multiplier store_register_a_to_memory set_memory_pointer third_number load_register_a_from_memory set_memory_pointer fourth_number load_register_b_from_memory add_register_b_to_a set_memory_pointer multiplicand store_register_a_to_memory load_register_a_with_value 0 set_memory_pointer multiplication_result store_register_a_to_memory set_memory_pointer multiplier load_register_a_from_memory set_memory_pointer multiplicand load_register_b_from_memory push_register_a_to_stack // Multiplication is done so that multiplicand stays constantly // in register B. The content of register B (i.e. multiplicand) // will be added to multiplication result as many times as // is the value of multiplier. The decreasing value of // multiplier is held on the top of the stack. multiply_numbers: pop_register_a_from_stack jump_if_register_a_zero multiplication_ready decrement_register_a push_register_a_to_stack set_memory_pointer multiplication_result load_register_a_from_memory add_register_b_to_a store_register_a_to_memory jump_to_address multiply_numbers multiplication_ready: set_memory_pointer left_parenthesis_text call_subroutine display_text set_memory_pointer first_number load_register_a_from_memory call_subroutine print_register_a_in_decimal_form set_memory_pointer plus_sign_text call_subroutine display_text set_memory_pointer second_number load_register_a_from_memory call_subroutine print_register_a_in_decimal_form set_memory_pointer asterisk_text call_subroutine display_text set_memory_pointer third_number load_register_a_from_memory call_subroutine print_register_a_in_decimal_form set_memory_pointer plus_sign_text call_subroutine display_text set_memory_pointer fourth_number load_register_a_from_memory call_subroutine print_register_a_in_decimal_form set_memory_pointer right_parenthesis_text call_subroutine display_text set_memory_pointer equal_sign_text call_subroutine display_text set_memory_pointer multiplication_result load_register_a_from_memory call_subroutine print_register_a_in_decimal_form end_of_main_program: stop_processing first_number: CONSTANT 3 second_number: CONSTANT 2 third_number: CONSTANT 31 fourth_number: CONSTANT 11 multiplier: DATA 1 multiplicand: DATA 1 multiplication_result: DATA 1 left_parenthesis_text: STRING "(" plus_sign_text: STRING "+" right_parenthesis_text: STRING ")" asterisk_text: STRING ")*(" equal_sign_text: STRING "=" display_text: load_register_a_from_memory jump_if_register_a_zero end_of_display_text output_byte_from_register_a increment_memory_pointer jump_to_address display_text end_of_display_text: return_to_calling_program print_register_a_in_decimal_form: // First we zero all the data-areas used by this subroutine. load_register_b_with_value 0 set_memory_pointer hundreds_in_byte store_register_b_to_memory set_memory_pointer tens_in_byte store_register_b_to_memory set_memory_pointer ones_in_byte store_register_b_to_memory find_hundreds_in_byte: load_register_b_with_value 100 jump_if_register_a_smaller_than_b find_tens_in_byte subtract_register_b_from_a set_memory_pointer hundreds_in_byte load_register_b_from_memory increment_register_b store_register_b_to_memory jump_to_address find_hundreds_in_byte find_tens_in_byte: load_register_b_with_value 10 jump_if_register_a_smaller_than_b find_ones_in_byte subtract_register_b_from_a set_memory_pointer tens_in_byte load_register_b_from_memory increment_register_b store_register_b_to_memory jump_to_address find_tens_in_byte find_ones_in_byte: set_memory_pointer ones_in_byte store_register_a_to_memory print_hundreds_tens_and_ones: set_memory_pointer hundreds_in_byte load_register_a_from_memory add_value_to_register_a '0' output_byte_from_register_a set_memory_pointer tens_in_byte load_register_a_from_memory add_value_to_register_a '0' output_byte_from_register_a set_memory_pointer ones_in_byte load_register_a_from_memory add_value_to_register_a '0' output_byte_from_register_a end_of_print_register_a_in_decimal_form: return_to_calling_program // The following are the "local data" of subroutine // print_register_a_in_decimal_form. This data is local because // only this subroutine uses them. hundreds_in_byte: DATA 1 tens_in_byte: DATA 1 ones_in_byte: DATA 1