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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

汇编语言:利用栈的特性对内存数据进行逆置

發布時間:2025/3/15 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 汇编语言:利用栈的特性对内存数据进行逆置 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

問題介紹

今天我們來解決這樣一個問題,利用棧的的特性,將代碼段中定義的數據進行逆序存放。請看下面代碼段:

assume cs:code code segmentdw 0123h,0456h,0789h,0abch,0defh,0fedh,0cbah,0987h;? code ends end start
預備知識

  • 對代碼段使用數據是dw(define word) 程序會向內存申請一個字單元也就是2個字節。
  • 如何將一段連續的內存空間設置為一個棧段使用ss、sp 寄存器,ss 代表棧段的段地址,sp代表偏移地址,注意彈棧 壓棧 sp 都移動的2個字節
  • 壓棧彈棧問題彈棧是 向將數據彈出,再進行的sp = sp +2,壓棧是 先將 sp = sp-2 后在壓數據 ,為啥呢?是因為彈棧 壓棧都是根據偏移量sp進行push和pop的!你仔細領悟領悟。所以在壓棧前我們的 sp 要指向 空閑單元的地址高1個字節的內存單元,這一點很重要。如果你理解了,就知道為啥 c/c++中有這樣一個說法,棧的生長是從高地址到低地址了。
  • 可以通過段寄存器:偏移量對內存單元進行訪問
  • 循環語法loop的使用。

  • 代碼展示

    assume cs:code code segmentdw 0123h,0456h,0789h,0abch,0defh,0fedh,0cbah,0987hdw 0,0,0,0, 0,0,0,0start:;設置 棧段mov ax,csmov ss,axmov sp,20h;設置訪問內存單元 可以用段地址:偏移地址表示 偏移地址用寄存器存放 可變mov bx,0;設置 循環次數mov cx,8;先壓棧s:push cs:[bx]add bx,2loop smov bx,0 mov cx,8;后彈棧s1:pop cs:[bx]add bx,2loop s1mov ax,4c00hint 21h code ends end start

    代碼討論

    在匯編語言 王爽 書中的原代碼中,定義的是 16字單元,sp 是設置的 30h,猜想作者是申請更多空間,反正沒壞處。其實本人認為定義8個字單元足夠,我們需要逆置的數據也才8個字單元,如果申請8個字單元,那么sp的設置就要當心了,是空閑單元的最高地址+1,先移動到空閑單元然后開始壓棧!地址最高的空閑單元是sp = 19h ,所以 mov sp,20h 沒毛病,網上有說mov sp,21h 這是錯的。壓棧前sp指向代碼段第一條指令,sp 先-2 然后壓入1個字數據!

    檢測結果

    第一步查看內存單元數據


    第二步代碼運行到第一個循環(壓棧)結束,查看是否將內存單元的數值全部壓棧到空閑單元


    第三步代碼運行到第二個循環(彈棧)結束,查看內存單元數值是否逆置



    總結

    以上是生活随笔為你收集整理的汇编语言:利用栈的特性对内存数据进行逆置的全部內容,希望文章能夠幫你解決所遇到的問題。

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