組合語言學習筆記

2021-10-07 06:39:00 字數 3540 閱讀 7616

編譯下面的程式,生成列表檔案,觀察標號在機器碼中變成了什麼?

小組中的同學都說一說,說出你看到了什麼,說出你的疑問,讓小夥伴們一起解決。

下面是程式————

;這個程式的功能沒有意義,只用於觀察程式中的標號

assume cs:codesg,ds:datasg

datasg segment

a db 1, 2, 3, 4, 5, 6, 7, 8

b dw 4 dup (0ffh)

x dd 28

y db 『abc』

datasg ends

codesg segment

c_begin:

dw 8 dup (0)

add dx, dx

start:

mov ax, datasg

mov ds, ax

mov si, offset b

mov di, offset c_begin

mov dx, offset start - offset c_begin

jmp short beg_copy

s1:mov al, [si]

mov cs:[di], al

inc si

inc di

loop s1

s2:mov ax, 4c00h

int 21h

beg_copy:

mov ax, 0

add ax, ax

jmp short s1

end_copy: nop

mov ax,4c00h

int 21h

codesg ends

end start

指令:在彙編過程中經過編譯以後執行的

偽指令:寫在程式中便於寫程式,在編譯的過程中被執行的 //offset。。。。。是

任務2-1:將virus_beg到virus_end之間的**複製到0:200h處

請補充完整下面**

assume cs:codeseg

codeseg segment

start:

mov si, _________________ ;設定「病毒」源位址

mov ax, 0

mov es, ax

mov di, 200h ;設定「病毒」目標位址

mov cx, ______________________ ;迴圈次數,即「病毒」**位元組數

copy:

;完善這段**,完成複製

loop copy

stop_copy:

mov ax, 4c00h

int 21h

virus_beg: ;這兒是要被複製的「病毒」**

mov ax, 0

add ax, ax

loop virus_beg

end_copy: nop

codeseg ends

end start

assume cs:codeseg

codeseg segment

start:

mov ax,codeseg

mov ds,ax

mov si, offset virus_beg;設定"病毒"源位址

mov ax, 0

mov es, ax

mov di, 200h ;設定"病毒"目標位址

mov cx, offset end_copy-offset virus_beg;迴圈次數,即"病毒"**位元組數

copy:

;完善這段**,完成複製

mov al,[si]

mov es:[di],al

inc si

inc di

loop copy

stop_copy:

mov ax, 4c00h

int 21h

virus_beg: ;這兒是要被複製的"病毒"**

mov ax, 0

add ax, ax

loop virus_beg

end_copy: nop

codeseg ends

end start

任務2-2:將上面用loop構造的迴圈,改寫為用jcxz和jmp構造的迴圈

assume cs:codeseg

codeseg segment

start:

mov ax,codeseg

mov ds,ax

mov si, offset virus_beg;設定"病毒"源位址

mov ax, 0

mov es, ax

mov di, 200h ;設定"病毒"目標位址

mov cx, offset end_copy-offset virus_beg;迴圈次數,即"病毒"**位元組數

copy:

;完善這段**,完成複製

s:jcxz stop_copy

mov al,[si]

mov es:[di],al

inc si

inc di

sub cx,1

jmp s

stop_copy:

mov ax, 4c00h

int 21h

virus_beg: ;這兒是要被複製的"病毒"**

mov ax, 0

add ax, ax

loop virus_beg

end_copy: nop

codeseg ends

end start

(請在debug中完成,emu8086中不能看到區別,此處存疑。)

任務:在下面的**________處,分別填入下面的四個選項,觀察編譯後的彙編指令及機器碼,解釋為什麼會出現觀察到的結果。

(1) jmp short s(先觀察錯誤,修改後重編譯再解釋) //段內短轉移 8位

(2)jmp near ptr s //段內近轉移 16位

(3)jmp far ptr s // 段間遠轉移 修改cs ip

(4)mov bx, offset s

jmp bx //直接轉移 16位

(5) jmp word ptr 記憶體單元位址(段內轉移) //轉移位址在記憶體中的jmp指令,從記憶體單元位址處開始存放著乙個字, 是轉移的目的偏移位址。(ip)

(6) jmp dword ptr記憶體單元位址(段間轉移) //功能:從記憶體單元位址處開始存放著兩個字,高位址處的字是轉移的目的段位址,低位址處是轉移的再的偏移位址。(cs)=(記憶體單元位址+2)

(ip)=(記憶體單元位址)

(7)jcxz 標號 // 當cx!=0 時跳轉到標號處

程式如下:

assume cs:codesg

codesg segment

start: mov ax,0

mov bx,0

____________

db 256 dup (0)

s: add ax,1

inc ax

codesg ends

end start

組合語言學習筆記

學習參考資料 大灰狼 講彙編 資料匯流排,位址匯流排,控制匯流排。位址匯流排有多少條就決定了cpu最大的記憶體使用量。80386有32位位址匯流排,所以它的定址能力就是4g.暫存器 通用暫存器,段暫存器,ax暫存器 通用暫存器,存放資料。高位位元組ah,低位位元組al。實體地址表示方法 位址加法器,...

組合語言學習筆記

cs ip是指向程式執行的位置 code segment ds 儲存記憶體中取資料的位址,data segment ss sp是指向堆疊的位置 stack segment cx 裡儲存的是loop執行的標誌 loop執行時,cx cx 1,若此時cx裡值為0,則跳出loop,否則繼續loop 初始 ...

組合語言學習筆記

組合語言 assembly language 是任何一種用於電子計算機 微處理器 微控制器或其他可程式設計器件的低階語言,亦稱為符號語言。在組合語言中,用助記符代替機器指令的操作碼,用位址符號或標號代替指令或運算元的位址。在不同的裝置中,組合語言對應著不同的機器語言指令集,通過彙編過程轉換成機器指令...