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標誌位影響, 可以由指令修改
STD給DF標誌位置1;
CLD給DF標誌位置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: