1. 程式人生 > 其它 >16位彙編 06

16位彙編 06

>> 串操作

>> 串操作指令

串操作指令要配合下面的重複字首使用

** 源運算元使用SI, 預設段為DS, 可段超越

目的運算元使用DI, 預設段為ES, 不可段超越

>> 記憶體拷貝

1:movsb: 一次拷貝一個位元組 ,si和di自加1或者自減1

2: movsw: 一次拷貝兩個位元組,si和di自加2或者自減2

還有一種拷貝指令:movs

用法: movs byte ptr [di], byte ptr cs:[si]

movs wprd ptr [di], word ptr cs:[si]

上面的指令為記憶體拷貝到記憶體指令

>>記憶體賦值(初始化記憶體)

3: stosb

4: stosw

3,4指令為將al,或者ax內容,儲存到di所指向的記憶體(給記憶體賦值

>> 記憶體取值

5: loasb

6: loasw

5,6指令為將SI所指向的記憶體內容,讀到al或者ax中 (從記憶體取值

>> 記憶體塊比較

7: cmpsb

8: cmpsw

si指向的記憶體與di指向的記憶體比較, si內容- di內容, 不儲存結果, 影響結果標誌位(ZF)

>> 記憶體值比較(查詢值)

9: scasb

10:scasw

al或者ax減去di所指向的記憶體內容, 不存結果, 影響標誌位

al/ax - di

>>總結

>> 串方向

串方向由DF標誌位影響, 可以由指令修改

STDDF標誌位置1;

CLDDF標誌位置0;

>> 重複字首

串操作指令一般配合重複字首使用, 實現記憶體的批量操作。

上面表中左後一行中regnz錯了, 應該是repnz

先在cx裡指明要拷貝的記憶體大小, 每次拷貝一個位元組, cx值減1, 直到cx值為0,

記憶體拷貝完畢

示例:

>> 流程轉移

核心為改IP值

>> 無條件跳轉

>> 直接跳轉

短跳近跳都是段內跳轉,遠眺可以跨段跳轉

短跳最多可以跳FF = 255個位元組

近跳最多可以跳FFFF= 65535個位元組

短跳和近跳一般中間不用加上修飾符, 編譯器會自定識別

遠跳有兩種寫法:

>> 計算跳轉指令(重點)

jmp指令中, 如果機器碼中有偏移, 該偏移是下一條指令跳轉目的地址偏移

該偏移可以是正數,也可以是負數

因為解析指令時, 取指令已經完成, IP已經變為下一條指令。

當我們知道了, 跳轉的起始地址和目的地地址時,計算跳轉指令, 演算法是:

目的地址 - (起始地址+2/3/5) = EBXX / E9XXXX / EAXXXXXXXX

>> 間接跳轉

** 使用暫存器間接跳轉

1: 格式jmp reg

2: reg為通用暫存器 (2個位元組, 只能用於近處跳)

3:功能 ip <-reg

4: 只能用於段內轉移

>> 條件跳轉

圖1:

圖2:

圖3:

圖4: