知识点整理:
[bx+idata]
表示一个内存单元,它的偏移地址为(bx)+idata
(bx中的数值加上 idata)易错题:
assume cs:codesg,ds:datasg,ss:stacksg
datasg segment
db 'ibm '
db 'dec '
db 'dos '
db 'vax '
datasg ends
stacksg segment ;定义一个段,用来做栈段,容量为16个字节
dw 0,0,0,0,0,0,0,0
stacksg ends
codesg segment
start:mov ax,stacksg
mov ss,ax
mov sp,16
mov ax,datasg
mov ds,ax
mov bx,0
mov cx,4
s0:push cx
mov si, 0
mov cx, 3
s:mov al,[bx+si]
and al,11011111b
mov [bx+si],al
inc si
loop s
add bx, 16
pop cx
loop sO
mov ax,4c00H
int 21H
codesg ends
end start
知识点整理:
reg
来表示一个寄存器,用sreg
表示一个段寄存器。bx,si,di,bp
这4个寄存器可以用在"[]"中来进行内存单元的寻址.在[…]中,这4个寄存器可以单个出现,或只能以4种组合出现:bx和si、bx和di、bp和si、bp和di。bp
,而指令中没有显性地给岀段地址,段地址就默认在ss
中。比如下面的指令。汇编指令 | 指令执行前数据的位置 |
---|---|
mov bx,[0] | 内存,ds:0单元 |
mov bx,ax | CPU内部,ax寄存器 |
mov bx,1 | CPU内部,指令缓冲器 |
寻址方式 | 含义 | 名称 |
---|---|---|
[idata] | EA=idata; SA=(ds) | 直接寻址 |
[bx] | E A=(bx); S A=(ds) | 寄存器间接寻址 |
[si] | EA=(si);SA=(ds) | |
[di] | E A=(di); S A=(ds) | |
[bp] | E A=(bp); S A=(ss) | |
[bx+idata] | E A=(bx)+idata; S A=(ds) | 寄存器相对寻址 |
[si+idata] | E A=(si)+idata; S A=(ds) | |
[di+idata] | E A=(di)+idata; S A=(ds) | |
[bp+idata] | E A=(bp)+idata; S A=(ss) | |
[bx+di] | E A=(bx)+(di); S A=(ds) | 基址变址寻址 |
[bp+si] | E A=(bp)+(si); S A=(ss) | |
[bp+di] | E A=(bp)+(di); S A=(ss) | |
[bx+si+idata] | E A=(bx)+(si)+idata;SA=(ds) | 相对基址变址寻址 |
[bx+di+idata] | EA=(bx)+(di)+idata;SA=(ds) | |
[bp+si+idata] | E A=(bp)+(si)+idata;SA=(ss) |
操作符x ptr
指明内存单元的长度,x在汇编指令中可以为word或bytdiv
是除法指令div byte ptr ds:[0]
div word ptr es:[0]
db
定义字节型数据;dw
定义字节型数据和字型数据;dd
是用来定义dword(double word,双字)型数据的dup
是一个操作符,用来进行数据的重复db 3 dup (0)
易错题:
知识点总结:
offset
的功能是取得标号的偏移地址jmp
为无条件转移指令,可以只修改IP,也可以同时修改CS和IP。jmp short 标号
(转到标号处执行指令),实现的是段内短转移jmp near ptr 标号
,它实现的是段内近转移jmp far ptr 标号
实现的是段间转移,又称为远转移, 用标号的段地址和偏移地址修改CS和IPjmp 16位 reg
jmp word ptr 内存单元地址(段内转移)
jmp dword ptr 内存单元地址(段间转移)
jcxz
指令为有条件转移指令,所有的有条件转移指令都是短转移,在对应的机器码中包含转移的位移,而不是目的地址。对IP的修改范围都为:-128〜127jcxz 标号
(如果(cx)=0,转移到标号处执行。loop
指令为循环指令,所有的循环指令都是短转移loop 标号
((cx)=(cx)-l,如果(CX)尹0,转移到标号处执行。dec
指令的功能和inc
相反,dec bx进行的操作为:(bx) = (bx) -1nop
为空指令,占一个字节易错题:
assume cs:code
data segment
```
data ends
code segment
start: mov ax,data
mov ds,ax
mov bx,0
jmp word ptr [bx+1]
code ends
end start
若要使程序中的 jmp 指令执行后,CS:IP 指向程序的第一条指令,在 data 段中应该定义哪些数据?assume cs:code,ds:data
data segment
dd 12345678hdata ends
code segment
start: mov ax,data
mov ds,ax
mov bx,0
mov [bx],** /bx
mov [bx+2],** /cs
jmp dword ptr ds:[0]
code ends
end start
补全程序,使 jmp 指令执行后,CS:IP 指向程序的第一条指令。mov ax,2000H
mov es,ax
jmp dword ptr es:[1000H]
后,(CS)=? , (IP)=? assume cs:code
data segment
db 'welcome to masm!'
data ends
code segment
start: mov ax,data
mov ds,ax
mov ax,0b800h
mov es,ax
mov si,0
mov di,10*160+80 ;第十行中间
mov cx,16
s1: mov al,ds:[si]
mov ah,00000010B ;绿色
mov es:[di],ax
inc si
inc di
inc di
loop s1
mov si,0
mov di,11*160+80 ;第十一行中间
mov cx,16
s2: mov al,ds:[si]
mov ah,00100100B ;绿底红色
mov es:[di],ax
inc si
inc di
inc di
loop s2
mov si,0
mov di,12*160+80 ;第十二行中间
mov cx,16
s3: mov al,ds:[si]
mov ah,01110001B ;白底蓝色
mov es:[di],ax
inc si
inc diinc di
loop s3
mov ax,4c00h
int 21h ;如果要看到完整的显示请输入:“-g 4c”,即立即运行到此条指令
code ends
end start
注:此程序如果利用后面所学知识,可以将三次显示嵌套简化为一次。
知识点总结:
call 标号
(将当前的IP压栈后,转到标号处执行指令)call far ptr 标号
实现的是段间转移。call 16位reg
call word ptr 内存单元地址
call dword ptr 内存单元地址
mul
是乘法指令;只能是相同位数的数相乘;数默认放在ax中;8位乘法,结果默认放在AX中;16位乘法,结果高位默 认在DX中存放,低位在AX中放。易错题整理:
内存地址 机器码 汇编指令
1000:0 b8 00 00 mov ax,0
1000:3 e8 01 00 call s
1000:6 40 inc ax
1000:7 58 s:pop ax
解:ax=6 ;指行完call s后ip=6,压入栈
2. 下面的程序执行后,ax 中的数值为多少?
内存地址 机器码 汇编指令
1000:0 b8 00 00 mov ax,0
1000:3 9a 09 00 00 10 call far ptr s
1000:8 40 inc ax
1000:9 58 s:pop ax
add ax,ax
pop bx
add ax,bx
解:ax=1010h;执行完call far ptr s后cs=1000h先入栈,ip=8后入栈
3. 下面的程序执行后,ax 中的数值为多少?
内存地址 机器码 汇编指令
1000:0 b8 06 00 mov ax,6
1000:2 ff d0 call ax
1000:5 40 inc ax
1000:6 mov bp,sp
add ax,[bp]
解:ax=11;执行完call ax后,ip=5入栈,程序跳转到mov bp,sp
执行完add ax,[bp]后 ax = 6+5 = 11
5.
mov sp,10h
mov ax,0123h
mov ds:[0],ax
mov word ptr ds: [2],0
call dword ptr ds:[0]
执行后,(CS)=0, (IP)=0123H, (sp)=0CH
6. 下面的程序执行后,ax 中的数值为多少?
assume cs:codestack segment
dw 8 dup (0)
stack ends
code segment
start: mov ax,stack
mov ss,ax
mov sp,16
mov ds,ax
mov ax,0
call word ptr ds:[0EH]
inc ax
inc ax
inc ax
mov ax,4c00h
int 21h
code ends
end start
解:ax=3
assume cs:code
stack segment
dw 8 dup (0)
stack ends
code segment
start: mov ax,stack
mov ss,ax
mov sp,16
mov word ptr ss:[0],offset s
mov ss:[2],cs
call dword ptr ss:[0]
nop
s: mov ax,offset s
sub ax,ss:[0cH]
mov bx,cs
sub bx,ss:[0eH]
mov ax,4c00h
int 21h
code endsend start
解:ax=1,bx=0