汇编语言学习笔记

观察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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值