[試験]2007年度前期計算システム基礎(B巻上機)


参照
1.(10%)LC-3アセンブラ設計:
R 0には整数が格納されている
s、1桁の整数を入力
m、見て
sは
mは1を出力し,逆に0を出力する.
Letter | ASCII
'0'    | x0030

2.(10%)Cプログラム設計:
書き込み方法check(char*s)、main()を使用してユーザーに文字列を入力させ、checkを呼び出し、結果を出力します.
check:sの「)」と「(」の個数を比較し、次の2つの条件を同時に満たす場合は、1を返し、逆に0を返します.
1)個数が同じ;
2)最初の文字から、出会った")"の個数は"("を超えたことがありません.
回答:
1. test1.asm
; Written by RednaxelaFX, 2008/01/09
; Copy original R0 to R1 to keep the value from being overwritten by TRAP IN
; Use R3 for stripping off ASCII '0'
; Use R4 to keep track of the final output
;
         .ORIG x3000
         ADD R1, R0, #0 ; R1 = R0 = s
         LD R3, A2I
         AND R4, R4, #0
         ADD R4, R4, #1
INPUT    TRAP x23
         ADD R0, R0, R3 ; R0 = m
         NOT R0
         ADD R0, R0, #1 ; R0 = -R0
MOD      ADD R1, R1, R0 ; s = s - m
         BRz OUTPUT1
         BRp MOD
OUTPUT0  ADD R4, R4, #-1
OUTPUT1  ADD R0, R4, #0
         TRAP x21
         HALT
A2I      .FILL x-30
         .END

2. test2.c
/*
 * Written by RednaxelaFX, 2008/01/09
 */

#include <stdio.h>

int check( char* s ) {
    char* ptr;
    int diff = 0;
    
    ptr = s;
    for ( ; ( '\0' != *ptr ) && ( diff >= 0 ); ++ptr ) {
        if ( '(' == *ptr) {
            ++diff;
        } else if ( ')' == *ptr ) {
            --diff;
        }
    }
    
    return diff ? 0 : 1;
}

void main( ) {
    char input[50]; // input buffer
    int result;
    
    printf( "Enter a string: " );
    scanf( "%s", input );
    
    result = check( input );
    
    printf("result is: %d
", result); }