トップ->アセンブラ入門

あなたは

人目のアセンブラの受講生です。

アセンブラ入門内検索

目次
アセンブラトップ
0. はじめに

1. 基礎
   1. レジスタとは
   2. セグメントとは

2. MOV命令
   1. MOV命令
   2. コンパイル
   3. 即値の転送
   4. メモリーへの転送
   5. データ定義疑似命令
   6. 練習問題

3. 算術演算
   1. 符号なし演算と符号付き演算
   2. 足し算
   3. 練習問題
   4. フラグ
   5. 引き算
   6. かけ算
   7. わり算
   8. INC,DEC

4. 分岐
   1. 無条件分離
   2. 比較命令
   3. 条件分離
   4. 練習問題
   5. ループ
   6. サブルーチン
   7. スタックとは
   8. PUSH,POP
   9. 練習問題

5. 論理演算
   1. AND命令
   2. OR命令
   3. XOR命令
   4. NOT命令
   5. NEG命令
   6. TEST命令
   7. 練習問題

6. シフト演算
   1. シフト
   2. ローテート
   3. 練習問題1
   4. 練習問題2

7. ストリング命令
   1. ストリング命令とは
   2. MOVS?
   3. REP
   4. DFの設定
   5. LODS?
   6. STOS?
   7. SCAS?
   8. CMPS?
   9 .練習問題

8. 入出力
   1. 概要
   2. IN命令
   3. OUT命令
   4. INS,OUTS命令

9. その他
   1. LEA
   2. XCHG
   3. NOP

10. 割り込み
   1. 割り込みとは
   2. ソフトウェア割り込み
   3. ハードウェア割り込み
   4. 割り込みベクター
   5. 割り込み処理の作り方
   6. 練習問題

11. レジスタの型変換(キャスト)

12. 卒業試験
   1. 卒業試験
   2. 画像データの格納形式
   3. インラインアセンブラ
   4. ネガポジ反転
   5. 明るくする、暗くする
   6. グレースケール
   7. 二値化
   8. 上下反転、左右反転
   9. 4分割
   10. モザイク
   11. シャープ
   12. ぼかし
   13. エンボス
   14. ディザ拡散
   15. 鉛筆を置いてください

13. 終わりに

文字コード

アセンブラ 〜MS-DOSの世界〜


・ このページの先頭に戻る
・ トップページに戻る



・ このページの先頭に戻る
・ トップページに戻る

トップ-> アセンブラ入門:4章.分岐-> 4-9.練習問題

←前ページへ :  トップへ :  次の章へ→



4-9.練習問題

問題
文字列を入力するサブルーチンを作れ。文字列の最後には0Dhが格納するものとする。
呼び出す条件として、BXには入力した文字列を格納するバッファーのアドレス、 CXには最大入力文字数-1が入っているものとし、リターン情報として、 AXレジスタに文字数(0Dhは除く)を入れ、そのほかのレジスタは保存する。
また、BS(バックスペース)も有効とする。

ヒント:
  • BSの文字コードは08hである。ただし、BSを表示しただけではカーソルが戻るだけなので、 スペースを表示し、もう一度カーソルを戻す(08hを表示させる)必要がある。
  • バックスペースを有効にするために、入力した文字がすぐに表示されては困る。 この場合はAH=8の状態で「INT 21h」を行うと、ALレジスタに入力された文字コードが 格納される。しかしAH=2と違い、入力された文字は表示されない(C言語でいう「getch()」)。

解答
CODE	SEGMENT
	ASSUME	DS:CODE,CS:CODE,ES:CODE,SS:CODE
	.186
	ORG	100h

START:
	mov	bx,offset DATA
	mov	cx,50
	call	LINEINP

	mov	ah,2
DISP:
	mov	dl,[bx]
	int	21h		;表示
	inc	bx
	cmp	dl,0dh
	jnz	DISP

	mov	ax,4c00h
	int	21h
DATA	db	52 dup(?)	;バッファー
;+------------------------
;|1行入力
;|最後には 0Dh が入る
;+------------------------
;|in  bx <= buffer(offset)
;|    cx <= 最大文字数
;+------------------------
;|out ax <= 入力文字数
;|          (改行なし) 
;+------------------------
;|break ; ax
;+------------------------
LINEINP	proc
	push	dx
	push	di
	inc	cx
	mov	di,0
INPUT:	mov	ah,8
	int	21h

	cmp	al,8		;BSか?
	jz	_BS

	mov	[bx+di],al

	cmp	al,0dh		;リターンキーか?
	jz	_RET

	cmp	di,cx		;文字数制限大丈夫?
	jz	OVER
	inc	di

DISPC:	mov	dl,al
	mov	ah,2
	int	21h		;disp char

	jmp	short INPUT

OVER:
	mov	[di+bx-1],al	;入力可能文字数を超えていた場合の処理
	push	ax
	mov	ah,2
	mov	dl,8
	int	21h		;disp BS
	pop	ax
	jmp	short DISPC


_BS:	or	di,di
	jz	INPUT		;何も入力されていなかったらBS無効

	mov	ah,2
	mov	dl,8
	int	21h		;disp BS
	mov	ah,2
	mov	dl,' '
	int	21h		;disp SP
	mov	ah,2
	mov	dl,8		;disp BS
	int	21h
	dec	di
	jmp	short INPUT

_RET:
	mov	ah,2
	mov	dl,0dh
	int	21h
	mov	ah,2
	mov	dl,0ah
	int	21h		;改行

	mov	ax,di
	pop	di
	pop	dx
	dec	cx
	ret
	endp
	ENDS
	END	START
; 一部のコンパイラでは、
;CODE	ENDS
;	END	START
;と記述しなければいけないようです


←前ページへ :  トップへ :  次の章へ→