(2011.11.1.02)アセンブル_王爽_第10章_勉強のまとめ
(2011.11.1.02)アセンブル_王爽_第10章_勉強のまとめ
この章の内容:
1.callとret命令の使用
2.callとretを用いたサブルーチンの作成
3.mul指令(乗算)の使用
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
知識点のまとめ:
現在、個人はセグメント内転送とセグメント間転送に基づいて、プログラム中の呼び出し方法の対応によって2種類にまとめられ、主な機能はプログラム中のサブプログラムの作成を実現することであり、高級言語中の関数呼び出しに相当し、知識点は以下の通りである.
一.セグメント内転送(IPのみ変更)
->命令:call番号call word ptr[メモリセルアドレス]
原理:セグメント内転送を実現する原理は以下の2つのステップに相当する
ステップ1:push IP
ステップ2:jmp near ptr符号jmp word ptr[メモリアドレス]
->コマンド:ret
原理:IPを変更し、セグメント内転送ジャンプを実現し、命令が完了した後、IPをret命令後のメモリユニットに向ける
ステップ1:pop IP
二.セグメント間転送(改CS:IP)
->命令:call far ptrラベルcall dword ptr[メモリセルアドレス]
原理:セグメント間転送を実現する原理は以下の3つのステップに相当する
ステップ1:push CS
ステップ2:push IP
ステップ3:jmp far ptr符号jmp dword ptr[メモリセルアドレス]
->コマンド:retf
原理:実観区間遷移ジャンプ原理は以下の2つのステップに相当する
ステップ1:pop IP
ステップ2:pop CS
三:サブルーチンを有するソースプログラムのフレームワーク
assume cs:code
code segment
main: ; ,
: ; ,
: ; , ,
call sub1 ;
:
:
mov ax, 4c00h
int 21h
sub1 : ; sub1
:
:
call far ptr sub2 ; sub1 , sub2
:
ret ;
sub2: ; sub2
: ; ,
: ;
: ;
: ;
retf ;
code ends
end main
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
; :1009_ _ .asm
; : data 3 , dword 。
assume cs:code
data segment
dw 1, 2, 3, 4, 5, 6, 7, 8 ; ,
dd 0, 0, 0, 0, 0, 0, 0, 0
data ends
code segment
start:
mov ax, data
mov ds, ax
mov si, 0 ; ds:si word ( )
mov di, 16 ; ds:di dword ( )
mov cx, 8
s:
mov bx, [si]
call cube ; ( : )
mov [di], ax ;
mov [di].2, dx ;
add si, 2 ; ds:si word
add di, 4 ; ds:di dword
loop s
mov ax, 4c00h
int 21h
cube: ; cube( : )
mov ax, bx
mul bx
mul bx
ret ; :mul 8 ( 255) 16 ( 255)
; 1 al ax
; 2 8 ( ) (reg) 16 ( ) (reg)
; ax dx:[ax]
code ends
end start
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
; :1012_ _ _ .asm
; : , , 。
assume cs:code
data segment
db 'word', 0
db 'unix', 0
db 'wind', 0
db 'good', 0
data ends
code segment
start:
mov ax, data
mov ds, ax
mov bx, 0
mov cx, 4 ;
s:
mov si, bx
call capital ;
add bx, 5 ; 5
loop s
mov ax, 4c00h
int 21h
; : , ,
; :ds:si
; :
capital: ;
push cx ;
push si
change:
mov cl, [si]
mov ch, 0
jcxz ok ; jcxz cx ,
; cl
and byte ptr [si], 11011111b
inc si
jmp short change
ok:
pop si ; , 。
pop cx
ret ;
code ends
end start
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
; : 10_ _ .asm
; : , , 0
; :
; :show_str
; : , , 0
; :(dh) = ( 0~24),(dl) = ( 0~79),
; (cl) = , ds:si
; :
; : 8 3 , data
assume cs:code
data segment
db 'Welcome to masm!', 0
data ends
code segment
start:
mov dh, 8 ;
mov dl, 3 ;
mov cl, 2 ;
mov ax, data
mov ds, ax ; ds
mov si, 0 ; si
call show_str
mov ax, 4c00h
int 21h
; :
; , ds:[si] B8000H - BFFFFH
; , es = B8000, [bx = dh].[di = dl], ,di
show_str:
mov al, dh ; [bx = dh]
mov ah, 160 ; 160
mul ah
sub ax, 160
mov bx, ax
mov al, dl ; [di = dl]
mov ah, 0
mov di, ax
mov ax, 0B800H ;
mov es, ax
s:
mov ch, [si] ; si
mov cl, 0
jcxz ok
mov al, ds:[si]
mov es:[bx+di], al
inc di
mov ah, 2 ;
mov es:[bx+di],ah
inc di
inc si
jmp short s
ok:
ret
code ends
end start