观察1:认清标号的本质
编译下面的程序,生成列表文件,观察标号在机器码中变成了什么?
小组中的同学都说一说,说出你看到了什么,说出你的疑问,让小伙伴们一起解决。
下面是程序————
;这个程序的功能没有意义,只用于观察程序中的标号
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. 造“病毒”
任务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
演练3. 观察、解释不同的转移
(请在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