■nasmで逆アセンブル
$ ndisasm -b 16 a.txt
■CRLF
crlf    db      0x0d,0x0a,0
■セグメントの設定
	push ds		;セグメントをスタックに保存
	mov ax, 9C0h	;セグメントを設定
	mov ds, ax
	mov al,[0h]	;これで9C00hの値を取り出せる
	pop ds		;セグメントをスタックから復帰
■ループ
cxの内容がloopを通るたびに1づつ引かれて、0になると抜ける
下の場合、cxは 5 4 3 2 1 となる
	mov cx,5
loop_1:
	;push cx
	;ループの内容
	;pop cx
	loop loop_1
■文字列の比較
;------------------------------------------ 
;文字列比較 alが0なら文字列は同一
;mov	si,string
;mov	di,stringpos
;call	strcmp
;------------------------------------------
strcmp:
	pusha
strcmpStart:
	mov al,[si]
	cmp al,0
	je .strcmpEquals
	cmp al,[di]
	jne .strcmpNotequals
	inc si
	inc di
	mov cx,[si]
	jmp strcmpStart
.strcmpEquals:
	mov al,[di]
	cmp al,0
	jne .strcmpNotequals
;文字列が同一
	popa
	mov al,0
	jmp strcmpEnd
.strcmpNotequals:
;文字列が違う
	popa
	mov al,1
strcmpEnd:
ret
■小文字を大文字に変換
;------------------------------------------ 
;小文字を大文字に変換
;mov     si,string
;call    strConvA
;------------------------------------------ 
strConvA:
	pusha	;全レジスタのスタック待避
strConvAloop:
	lodsb
	cmp al,0
	je strConvAEnd
	cmp al,'a'
	jb strConvAloop;<
	cmp al,'z'
	ja strConvAloop;>
	jmp ConvA
ConvA:
	mov cl,al
	mov ah,20h
	sub cl,ah
	mov [si-1],cl
jmp     strConvAloop
strConvAEnd:
	popa	;全レジスタのスタック復帰
ret
■文字列の長さを計算
;------------------------------------------ 
;文字列の長さを計算 文字列の長さがalに入ります
;mov     si,string
;call    strlen
;------------------------------------------
strlenpos db 0h
strlen:
	pusha	;全レジスタのスタック待避
	mov ah,0
strlenloop:
	lodsb
	cmp al,0
	je strlenend
	inc ah
	jmp     strlenloop
strlenend:
	mov [strlenpos],ah
	popa	;全レジスタのスタック復帰
	mov al,[strlenpos]
	ret
■文字列の複製
;------------------------------------------ 
;文字列の複製 siからdiに複製
;mov	si,string
;mov	di,stringpos
;call	strcpy
;------------------------------------------
strcpy:
	pusha	;全レジスタのスタック待避
strcpyloop:
	mov al,[si]
	mov [di],al
	inc si
	inc di
	cmp al,0
	je strcpyend
	jmp     strcpyloop
strcpyend:
	popa	;全レジスタのスタック復帰
	ret
	
■引き算
▼8bit
	mov cl,11
	mov ah,5
	sub cl,ah
	mov [anser],cl
▼16bit
	mov cx,5
	mov ax,2
	sub cx,ax
	mov [anser],cx
■足し算
▼8bit
	mov cl,11
	mov ah,5
	add cl,ah
	mov [anser],cl
▼16bit
	mov cx,2
	mov ax,3
	add cx,ax
	mov [anser],cx
■割り算 (100/20)
▼8bit
	xor dx,dx
	mov al,100
	mov cl,20
	div cl
	mov [anser],al
▼16bit
	xor dx,dx
	mov ax,100
	mov cx,20
	div cx
	mov [anser],ax
■掛け算
▼8bit
	push dx
	mov al,8
	mov bl,2
	mul bl
	mov [anser],al
	pop dx
▼16bit
	push dx
	mov ax,8
	mov bx,2
	mul bx
	mov [anser],ax
	pop dx
▲トップページ
 > 
プログラミングの実験
 > 
OSなしで実行できるプログラム