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