編譯下面的程式,生成列表檔案,觀察標號在機器碼中變成了什麼?
小組中的同學都說一說,說出你看到了什麼,說出你的疑問,讓小夥伴們一起解決。
下面是程式————
;這個程式的功能沒有意義,只用於觀察程式中的標號
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 是任何一種用於電子計算機 微處理器 微控制器或其他可程式設計器件的低階語言,亦稱為符號語言。在組合語言中,用助記符代替機器指令的操作碼,用位址符號或標號代替指令或運算元的位址。在不同的裝置中,組合語言對應著不同的機器語言指令集,通過彙編過程轉換成機器指令...