■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なしで実行できるプログラム