0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

アセンブリ言語(CASL2)を学習#3

Last updated at Posted at 2020-08-05

#はじめに
 引き続きCASL2をやっていきます。今回は分岐条件と比較演算をやります。
#casl2について
 casl2は文字コードJIS 0201です。16進数で表しています

\ #30 #40 #50 #60 #70
#0 0 / P / p
#1 1 A Q a q
#2 2 B R b r
#3 3 C S c s
#4 4 D T d t
#5 5 E U e u
#6 6 F V f v
#7 7 G W g w
#8 8 H X h x
#9 9 I Y i y
#A / J Z j z
#B / K / k /
#C / L / l /
#D / M / m /
#E / N / n /
#F / O / o /

#コード1(JUMP命令、JPL命令,JZE命令、JMI命令)

RANCH    START
          LD      GR0, DATA ; OF=0,SF=0,ZF=1
          JZE     LOOP1 ; LOOP1に飛ぶ
JP1       LD      GR0, DATA2 ; OF=0,SF=0,ZF=0
          JPL     LOOP2 ; LOOP2に飛ぶ
JP2       LD      GR0, DATA3 ; OF=0,SF=1,ZF=0
          JMI     LOOP3 ; LOOP3に飛ぶ
LOOP1     JUMP    JP1 ; 無条件でJP1に飛ぶ
LOOP2     JUMP    JP2 ; 無条件でJP2に飛ぶ
LOOP3     JUMP    EXIT ; 無条件でEXITに飛ぶ
DATA      DC      0
DATA2     DC      1
DATA3     DC      #8000 ; 最上位ビットが1
EXIT      RET
          END

##JUMP命令、JPL命令,JZE命令、JMI命令
 JUMP命令は無条件でオペランドで指定したラベルの行に飛びます。
 JPL命令はSF=0のとき、オペランドで指定したラベルの行に飛びます。(JPL = Jump on PLus)
 JZE命令JはZF=1のとき、オペランドで指定したラベルの行に飛びます。(JZE = Jump on ZEro)
 JMI命令JはSF=1のとき、オペランドで指定したラベルの行に飛びます。(JMI = Jump on MInus)

#JOV命令,JNZ命令
JOV命令はOF=1のとき、オペランドで指定したラベルの行に飛びます。(Jump on OVerflow)
JNZ命令はZF=0のとき、オペランドで指定したラベルの行に飛びます。(Jump on Not Zero)
##比較命令(CPA命令,CPL命令)
 CPA命令はオペランドで指定した値の比較をします。比較といっても実際には
(レジスタの中身)-(指定したアドレスの中身)を行い、符号の結果をフラグレジスタに格納しています。
 CPL命令もCPA命令と同じような動作をしますが、減算は論理演算であることに注意しましょう
#分岐・比較を用いたコード

RA2SA     START
          IN      IBUF, LEN ; Input String
          LD      GR0, IBUF ; GR0 <- IBUF
          CPA     GR0, BOUND ; 小文字か大文字かを判定
          JPL     S2L   ; 小文字ならS2L(Small to Large)
          JMI     L2S   ; 大文字ならL2S(Large to Small)
; 変換後の値を出力する
RSTART    ST      GR0, OBUF ; GR0 -> OBUF
          OUT     OBUF, LEN ; Output String
          RET
; 小文字から大文字に変換 * only character
S2L       SUBA    GR0, CHANGE
          JUMP    RSTART
; 大文字から小文字に変換 * only character
L2S       ADDA    GR0, CHANGE
          JUMP    RSTART
; define Constants and keeping memory
IBUF      DS      1
OBUF      DS      1
LEN       DC      1
CHANGE    DC      32
BOUND     DC      95
NOTCHAR   DC      65
ECODE     DC      97
          END

; 大文字を小文字に変換し、小文字を大文字に変換するプログラム(*文字コードJIS 0208でのみ出力可)

上のコードでは小文字であれば大文字に、大文字であれば小文字に変換します。
大文字と小文字の差は32であるのでそれを利用しています。
#終わりに
分岐条件では見にくくなりやすいので、コメントや条件をうまくやることが大切です。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?