(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