日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

汇编语言笔记10-CALL和RET指令

發布時間:2025/6/15 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 汇编语言笔记10-CALL和RET指令 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

?模塊化程序設計

  • 模塊化程序設計

    匯編語言通過callret指令實現了模塊化程序設計。可以實現多個相互聯系、功能獨立的子程序來解決一個復雜的問題。

  • 子程序的框架 1 assume cs:code 2 code segment 3 main: : 4 : 5 call sub1 ; 調用子程序sub1 6 : 7 : 8 mov ax, 4c00h 9 int 21h 10 11 sub1: : ; 子程序sub1開始 12 : 13 call sub2 ; 調用子程序sub2 14 : 15 : 16 ret ; 子程序返回 17 18 sub2: : ; 子程序sub2開始 19 : 20 : 21 ret ; 子程序返回 22 code ends 23 end main

    ?

  • ?callret指令

    指令

    功能

    匯編語法解釋

    備注

    ret

    用棧中的數據,修改IP的內容,

    實現近轉移。

    pop IP

    ??

    retf

    用棧中的數據,修改CSIP的內容,

    實現遠轉移。

    pop IP

    pop CS

    ??

    retn

    ??

    pop IP

    add sp, n

    見后面

    ? ?

    ? ?

    ? ?

    ? ?

    ? ?

    call

    ? ?

    ? ?

    ? ?

    ? ?

    call指令分為兩步:

    (1) 將當前的IP或者CSIP壓入棧中。

    (2) 轉移。

    格式

    匯編語法解釋

    call 標號

    push IP

    jmp near ptr 標號

    call far 標號

    push CS

    push IP

    jmp far ptr 標號

    call 16reg

    push IP
    jmp 16reg

    call word ptr 內存單元地址

    push IP
    jmp word ptr 內存單元地址

    call dword ptr 內存單元地址

    push CS
    push IP
    jmp dword ptr 內存單元地址

    ??

    ??

    ??

    call

    ??

    ?muldiv指令

    指令格式

    解釋

    示例


    mul reg

    mul 內存單元

    (1) 8位乘法:默認乘子一個放在AL中,另一個放在8reg或者內存字節單元中。默認結果放在AX

    (2)16位乘法:默認乘子一個放在AX中,另一個放在16reg或者內存字單元中。默認結果放在DX|AX中。

    mul byte ptr ds:[0]

    ; (ax)=(al)*((ds)*16+0)

    ??

    mul word ptr [bx+si+8]

    ; (dx|ax)=(ax)*((ds)*16+(bx)+(si)+8)

    div reg

    div 內存單元

    (1)16/8: 被除數默認放在AX中,除數放在8reg或者內存字節單元中。結果AL()AH(余數)

    (2)32/16: 被除數默認DX|AX中,除數放在16reg或者內存字單元中。結果AX(), DX(余數)

    (3)會產生越界問題(如何設計安全的div見后面)

    div byte ptr ds:[0]
    ; (al) = (ax)/((ds)*16+0)的商
    ; (ah) = (ax)/((ds)*16+0)的余數

    div word ptr [bx+si+8]

    ; (ax)=(ax)/((ds)*16+(bx)+(si)+8)的商

    ; (dx)=(ax)/((ds)*16+(bx)+(si)+8)的余數

    ??

    ?參數和結果傳遞

    位置

    優點

    缺點

    示例

    ??

    ??

    ??

    放在寄存器中

    ??

    ??

    ??

    最常見的方法

    快速

    ??

    ??

    ??

    寄存器數量有限,

    寄存器可能會沖突

    ; 說明:計算N3次方

    ; 參數: (bx)=N

    ; 結果: (dx:ax)=N^3

    cube:????????mov ax, bx

    mul bx

    mul bx

    ret

    放在數據段中

    批量數據的傳遞

    速度慢

    ; ds:si指向字符串(批量數據)所在空間的首地址

    ; cx存放字符串的長度

    capital:????????and byte ptr [si], 11011111b

    inc si

    loop capital

    ret

    放在棧中

    C語言的方式

    簡單方便

    ??

    詳細解釋

    ??

    • 1:用棧傳遞參數

      結合C語言的函數調用來學習棧傳遞參數的思想。

      ?

      1 ; 說明:計算(a-b)^3,a、b為字型數據 2 ; 參數:進入子程序時候,棧頂存放IP,后面依次存放a、b 3 ; 結果:(dx:ax)=(a-b)^3 4 difcube: push bp 5 mov bp, sp 6 mov ax, [bp+4] ;將棧中a的值送入ax中 7 sub ax, [bp+6] ; a-b 8 mov bp, ax 9 mul bp 10 mul bp 11 pop bp 12 ret 4 ; 彈出參數(將棧頂指針修改為調用前的值) 13 14 ;指令ret n的含義: 15 ; pop ip 16 ; add sp,n

      使用棧進行參數傳遞,所以調用者在匯編程序的時候要向棧中壓入參數,子程序在返回的時候可以使用ret n指令將棧頂指針修改為調用前的值。

    • 2 C語言處理方式(局部變量,也是使用棧) 1 void add(int, int, int); 2 3 void main() 4 { 5 int a = 1; 6 int b = 2; 7 int c = 0; 8 add(a, b, c); 9 c++; 10 } 11 12 void add(int a, int b, int c) 13 { 14 c = a + b; 15 }

      ? ? ? ? ? ??

    總結

    以上是生活随笔為你收集整理的汇编语言笔记10-CALL和RET指令的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。