汇编语言笔记(一):基础
章節目錄
作者能力有限, 如果您在閱讀過程中發現任何錯誤, 還請您務必聯系本人,指出錯誤, 避免后來讀者再學習錯誤的知識.謝謝!
本文中所有程序均在DOSBox下使用MASM, LINK編譯運行
簡單程序
- segment…ends: 偽指令, 用來定義一個段(比如,代碼段,數據段,堆棧段), segment 標識一個段的開始, ends 標識一個段的結束.
-
語法:
SegmentName segment
..
SegmentName ends - assume: 偽指令, 它假設某一段寄存器和程序中的某一個用 segment..ends 定義的段相關聯.
-
mov ax, 4c00h
int 21h
稱為程序返回,它的作用是將 CPU 的控制權交還給使他得以運行的程序.
-
使用段
使用 assume 將我們定義的數據段,堆棧段,代碼段和對應的段寄存器關聯起來.
cs 寄存器對應代碼段
ds 寄存器對應數據段
ss 寄存器對應堆棧段值得注意, 我們在訪問數據段或者堆棧段的時候,總是將段基址先保存在 ax 中,然后由 ax 保存到 ds 或者 ss. 為什么不直接將段基址保存到 ds 或者 ss 中? 答案是該操作非法.
簡單字符串處理程序
在這里, 我們使用 bx + offset 的語法訪問數據段中的字符串. 相應的字符的地址計算方法為 addr=ds?16+bx+offsetaddr=ds?16+bx+offset.
這里 offset 一般為常量. 如果不是常量, 我們可以使用 [bx+di+offset] 來完成. 相應的字符的地址計算方法為 addr=ds?16+bx+di+offsetaddr=ds?16+bx+di+offset.
對于棧的訪問可以使用 [bx+si+offset] 的方式訪問. 相應的字符的地址計算方法為 addr=ds?16+bx+si+offsetaddr=ds?16+bx+si+offset.使用 bx, si, di, bp 寄存器尋址
- 只有這四個寄存器可以用在 ‘[…]’ 中來進行內存單元尋址
-
比如:
mov ax, [bx]
mov ax, [bx+si]
mov ax, [bx+di]
可以使用 bp 替換 bx.//以下用法是錯誤的
mov ax, [ax]
mov ax, [cx]
mov ax, [dx]
mov ax, [ds] - 這四個寄存次可以單個出現在 ‘[…]’ 中或者以組合出現.
-
組合形式只能是以下四種:
mov ax, [bx + si + offset]
mov ax, [bx + di + offset]
mov ax, [bp + si + offset]
mov ax, [bp + si + offset]
當然 offset 可以為零.//以下用法是錯誤的
move ax, [di + si]
move ax, [bx + bp] - 只要在 ‘[…]’ 中使用 bp 寄存器, 而指令中沒有顯式的給出段地址, 段地址默認在 ss 中.
-
尋址方法
- 直接尋址
-
如: mov ax, [0] // 段基址在 ds 中
- 寄存器間接尋址
-
如:
mov ax, [bx] // 段基址在 ds 中. bx 指明偏移
mov ax, [si] // 段基址在 ds 中. si 指明偏移
mov ax, [di] // 段基址在 ds 中. di 指明偏移
mov ax, [bp] // 段基址在 ss 中. bp 指明偏移 - 寄存器相對尋址
-
如:
mov ax, [bx+offset] // 段基址在 ds 中. bx+offset 指明偏移
mov ax, [si+offset] // 段基址在 ds 中. si+offset 指明偏移
mov ax, [di+offset] // 段基址在 ds 中. di+offset 指明偏移
mov ax, [bp+offset] // 段基址在 ss 中. bp+offset 指明偏移 - 基址變址尋址
-
如:
mov ax, [bx+si] // 段基址在 ds 中. bx+si 指明偏移
mov ax, [bx+di] // 段基址在 ds 中. bx+di 指明偏移
mov ax, [bp+si] // 段基址在 ss 中. bp+si 指明偏移
mov ax, [bp+di] // 段基址在 ss 中. bp+di 指明偏移 - 相對基址變址尋址
-
如:
mov ax, [bx+si+offset] // 段基址在 ds 中. bx+si+offset 指明偏移
mov ax, [bx+di+offset] // 段基址在 ds 中. bx+di+offset 指明偏移
mov ax, [bp+si+offset] // 段基址在 ss 中. bp+si+offset 指明偏移
mov ax, [bp+di+offset] // 段基址在 ss 中. bp+di+offset 指明偏移指明數據長度
- 通過寄存器名指明要處理的數據的尺寸
-
// 使用字長度 (ax: 16bit)
mov ax, 1
mov ds:[0], ax// 使用字節長度 (al: 8bit)
mov al, 1
mov ds:[0], al - 在沒有寄存器名存在的情況下, 使用操作符 Type ptr 指明內存單元長度. Type 可以使 word 或者 byte.
-
// 使用字長度 (ax: 16bit)
mov word ptr ds:[0], 1
add word ptr [bx], 1// 使用字節長度 (al: 8bit)
mov byte ptr ds:[0], 1
add byte ptr [bx], 1 - 有些指令有默認的訪問數據長度. 比如 push 就只能進行字操作
-
div指令
注意問題:
- 除數: 有 8 位和 16 位兩種, 在一個 reg 或者內存單元中
- 被除數: 默認放在 AX 或者 DX 和 AX 中, 如果除數為 8 位, 被除數則為 16 位, 默認在 AX 中; 如果除數為 16 位, 被除數則為 32 位, 在 DX 和 AX 中存放, DX 存放高 16 位, AX 存放低 16 位.
- 結果: 如果除數為 8 位, 則 AL 存放除法操作的商, AH 存放余數; 如果除數為 16 位, 則 AX 存放除法操作的商, DX 存放余數;
-
歡迎交流任何想法.
End…
總結
以上是生活随笔為你收集整理的汇编语言笔记(一):基础的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: tensorflow 如何获取模型中想要
- 下一篇: 模拟网页行为之实践篇二