彙編學習筆記三

2021-09-25 23:19:31 字數 2526 閱讀 7337

我們可以以在一段記憶體中存放資料 資料段 存放我們自己定義的資料

我們可以在一段記憶體中存放指令 **段 我們自己定義的指令

我們可以將一段記憶體定義成棧空間 棧段 我們需要存放臨時資料

我們應該怎麼讓cpu按照我們的要求哪

對於資料段 段位址->ds段位址暫存器 [0],[1]… 來訪問記憶體單元

對於**段 我們可以修改cs和ip來指向我們定義的**段,這樣cpu變會執行我們定義的**段

對於棧段 我們可以修改ss和sp來決定了棧頂標記 這樣push和pop命令變會將這段空間當做棧段

因此我們可以總結出記憶體的安排是通過這幾個暫存器的指向來決定的,我們可以通過改變這幾個暫存器的指向來隨意定義空間

根據前面的問題我們隨意修改記憶體,當我們修改一些不能修改的記憶體空間時便會出錯

我們應該向安全的空間裡寫入資料和指令

通常情況下0:200~0:2ffh這段是安全的

還可以使用作業系統分配的記憶體空間,使用作業系統給我們分配的空間時安全的

我們每執行一段程式作業系統便會給我們分配一點記憶體,我們使用這段記憶體可以隨意寫入,而不必擔心有其他程式使用這段空間

原始檔 安排自己的**段 資料段 棧段 通過編譯和鏈結 生成exe檔案

assume cs:code,ds:data,ss:stack

data segment

db 128 dup (0)

data ends

stack segment stack

db 128 dup (0)

stack ends

code segment

start: mov ax,stack

mov ss,ax

mov sp,128

mov ax,4c00h

int 21h

code ends

end start

可以看到前面幾行是一些偽指令,作用是讓cpu知道**是資料段那裡是棧段和**段,如果沒有這樣的偽指令

編譯masm asm -> obj

鏈結link obj -> exe

編譯是將乙個程式分為很多的檔案分別進行編譯成obj 然後再鏈結將這些obj檔案鏈結在一起

系統是怎麼知道分配給乙個程式的記憶體的呢?

我們執行乙個程式,首先我們雙擊軟體的圖示,系統便會啟動這個程式,在程式啟動之前系統需要分配給這個程式記憶體,那麼系統是怎麼知道應該分配多大的記憶體哪?

在這個軟體中除了整個程式外,還包括一些資訊,比如檔案有多大,程式在那裡等,包含一些程式的描述資訊,系統就是根據這些描述資訊對暫存器進行設定的

start偽指令,便是在描述資訊中來設定cs和ip的

下面演示一下編譯鏈結的過程

編譯輸入masm表示開啟編譯器

然後輸入我們需要編譯的原始檔 t1.asm

會生成t1.obj

然後輸入link 啟動鏈結器

將上一步編譯生成的檔案輸入 t1.obj

還可以在list file的後面輸入t1.map表示生成描述檔案

描述檔案的資訊

start stop length name class

00000h 0007fh 00080h data

00080h 000ffh 00080h stack

00100h 0010ch 0000dh code

program entry point at 0010:0000

可以看到上面有資料段 **段和棧段的開始和結束的位址資訊

還有**的入口

系統根據這些描述資訊來進行設定

#原始檔的介紹

原始檔** asm

原始檔是彙編**寫成的

下面是乙個例子

assume cs:code,ds:data,ss:stack

data segment

db 128 dup (0)

data ends

stack segment stack

db 128 dup (0)

stack ends

code segment

start: mov ax,stack

mov ss,ax

mov sp,128

mov ax,4c00h

int 21h

code ends

end start

data segment

data ends

這兩個是成對使用的,告訴編譯器這裡是資料段

mov ax,10*20+2

這個指令在執行時的**是 mov ax,201 後面的是由編譯器運算出來的,運算出以後再由cpu執行這個指令

程式的返回

在程式執行完後系統便會將記憶體和暫存器釋放

使用debug追蹤程式

cx暫存器位程式的長度

p指令表示執行

q指令表示結束

psp區 從ds:0開始的256個位元組

IL 彙編學習筆記(三)

原文 http www.codeproject.com dotnet ilassembly.asp 建立和使用類物件 首先我們定義乙個簡單的類,它只包含乙個方法用於計算乙個整數的平方 square 如下 assembly extern mscorlib assembly mathlib module...

IL 彙編學習筆記(三)

原文 建立和使用類物件 首先我們定義乙個簡單的類,它只包含乙個方法用於計算乙個整數的平方 square 如下 assembly extern mscorlib assembly mathlib module mathlib.dll namespace hangamahouse 然後用命令 ilasm...

ARM彙編學習筆記三

常規 ldr r2,r5 將r5為位址的儲存單元中的資料載入到r2中。str r1,r0,0x04 將r1中的內容存放在以 r0 0x04 的記憶體位址單元中。傳送指令型別 ldrb r3,r2 1 以r2為位址讀取乙個位元組資料到r3中。r2更新 r2 r2 1 strh r1,r0,2 半字送達...