当前位置:文档之家› 8086汇编语言学习笔记

8086汇编语言学习笔记


后转到寄存器所指的 ip 处执行。
call word ptr 内存单元地址:把本指令(指 call word ptr 内存单元地址)下一
条指令的 ip 压入 sp,然后转到内存单元地址所指的 ip 处执行。
call dword ptr 内存单元地址:把本指令(指 call dword ptr 内存单元地址)下
7、如果某个地址的段地址是 ds,偏移地址是 bx+200,则要将这个位置的数据传到
ax 中,可以这样:
mov ax,[bx+200]或者 mov ax,200[bx]或者 mov ax,[bx].200
偏移地址也可以改为 bx+si 或者 bx+di,此时的格式:
mov ax,[bx+si]或者 mov ax,[bx][si]
(ax)/((es)*16+0)的余数
div word ptr [bx+si+8],该指令的结果:(ax) =
[(dx)*10000H+(ax])/((ds)*16+bx+si+8)的商,(dx) =
[(dx)*10000H+(ax])/((ds)*16+bx+si+8)的余数
div bx,该指令的结果:(ax) = [(dx)*10000H+(ax])/(bx)的商,(dx) =
或者 mov ax,126 e 1000:0000 01 02 03 04,表示将 01 02 03 04 顺序填入 1000:0000 表示的内存处 u 1000:0,可以查 1000:0 内存处的数据及其对应汇编指令 t,执行 cs:ip 寄存器所指的指令 g 0012,从 cs:ip 执行到 cs:0012 处,中间不停顿 p ,遇到 loop 循环,则一次把所有循环执行完再退出。 二、各寄存器的作用 1、ax,bx 等一般寄存器,可暂存数据 2、cs,ip 下一条要执行的指令存储在 cs 为段地址,ip 为偏移地址的内存中 3、ds 数据段寄存器,比如 mov al,[0],表示将 ds:0 这个内存中的数字传入 al 中。 要将内存 10000H 中的数传入 al 中,则应该这样: mov ax,1000 mov ds,ax ,因为不能直接 mov ds,1000 mov al,[0],寄存器 al 若为 16 位,则内存中有一个字要移入 al,要是为 32 位,
15、子程序调用中的参数及返回值
当参数或者返回值只有 1 个或者 2 个时,可以把参数及返回值放到寄存器当中,但
是当参数及返回值有 N 个时,则把批量数据放到内存中,然后把它们所在内存空间的
首地址放在寄存器中
,然后传递给需要的子程序或者主程序。当然也可以用堆栈来传递参数及结果。

16、mul 指令
围为:-128~127
loop 标号:(cx)=(cx)-1,如果(cs)!=0,则转到标号处开始执行,否则顺序向下执
行。此处转移条件和 jcxz 正好相反。
12、ret 和 retf 指令
ret 指令后,(ip)= (sp),(cs)不变,然后(sp) = (sp ) +2,该指令实现近转移,
则内存中有 2 个字要移入 al mov bl,[ax],将 ds:ax 表示的内存的字节传入 bl 寄存器中 mov bx,[ax],将 ds:ax 表示的内存的字传入 bx 寄存器中 4、ss,sp ss 存储堆栈段的段地址,sp 存储堆栈段的偏移地址,push 和 pop 指令涉及到的内
改 CS 和 IP。
jmp 16 位寄存器:其中 IP 地址放在 16 位寄存器中。
jmp word ptr 内存单元地址:其中内存单元地址存放的是 IP 的值。假如 ds:[0]这
个内存单元值为 0123H,则 jmp word ptr ds:[0]表示下一条指令执行地址为
cs:0123H
jmp dword ptr 内存单元地址:其中内存单元地址存放着 2 个字,高地址为 CS,低
地址为 IP。比如:
mov ax,0123H
mov ds:[0],ax

mov word ptr ds:2,0
jmp dword ptr ds:[0] 执行后,(CS)=0,(IP)=0123H
如 inc word ptr ds:[0] 用 byte ptr 标明这是字节操作,这是在 masm 中的用法,比如 inc byte ptr ds:[0] c、push [1000H],不用指明,直接进行字操作
四、各种指令 1、mov,移动,比如 mov ds,ax 将 ax 中的数据移入 ds 中 2、add,加法,比如 add ax,bx,将 bx 中的值与 ax 中的值相加并存入 ax 中 3、sub,减法,比如 sub ax,bx,将 ax 中的值减去 bx 中的值并存入 ax 中 4、push,入栈,比如 push ax,将 ax 寄存器中的值压入堆栈 ss:sp 指向的内存当中,
[(dx)*10000H+(ax])/(bx)的余数
9、jmp 指令
a、jmp short 标号:段内短转移,只能在一个段内转移,并且转移的距离范围是
-128~127
jmp near ptr 标号:段内近转移,转移距离为-32768~32767
jmp far ptr 标号:段间转移,far ptr 指明了指令用标号的段地址和偏移地址修
并把 sp 的值改为 sp-2(这是在 8086 当中,因为 ax 是 16 位寄存器,而内存单元为 8 位,因此一个寄存器的值要用两个内存 单元来存放) 5、pop,出栈,比如 pop ax,将 ss:sp 指向的内存的值送入 ax 中,并把 sp 的值改 为 sp+2 pop [0],将 ss:sp 内存中的数据弹出到 ds:0 内存中,注意 pop 操作是字为单位的操 作 6、注意 push 和 pop 指令中的超栈的界限问题 7、inc bx 将 bx 中的值加 1。 8、dec bx 将 bx 中的值减 1。和 inc bx 正好相反。 五、microsoft asm 格式下的各种命令: 0、一个程序要编译运行的基本架构: assume cs:code code segment start: .... mov ax,4c00H int 21H code ends end 这几行是基本的,不然程序无法编译运行。 1、程序完后要输入 mov ax,4c00H int 21H 帮助程序返回。 2、利用 loop 实现循环 mov cx,11,将 cx 寄存器值置为 11 s:add ax,ax,执行 ax=ax+1 add bx,bx,执行 bx=bx+1 loop s,执行 cx=cx-1,cx==0,则往下,cx!=0,则转到 s 标记的内存地址中继续 执行 3、在汇编程序中,数据不能由字母开头,故 mov ax,FFFFH 不合法,要改为 mov ax,0FFFFH 4、debug 中 mov ax,[0]表示将 ds:[0]内存中的值送入 ax 中 在 masm 汇编源程序中, mov ax,[0],表示将 0 送入 ax 中 在源程序中可修改为:mov ax,ds:[0]或者 mov ax,[bx]或者 mov ax,cs:[0]这里的 cs,ds 就是显示的指定段寄存器,一般默认段寄存器为 ds 5、end start 在 masm 中表示汇编程序在 start 指定的地方开始执行,要是 end d, 则表示在 masm 中汇编程序在 d 标号指定的地方开始执行
mul bl,mul byte ptr ds:[0],表示进行的是 8 位乘法,其中乘数放在 al 中,被乘
数放在 bl 或者内存单元中,结果放在 ax 中
mul bx,mul word ptr ss:[0],表示进行的是 16 位乘法,其中乘数放在 ax 中,被乘
数放在 bx 或者内存单元中,结果存放方式为:
10、jcxz 指令
这是有条件转移指令,所有的有条件转移指令都是短转移,即在段内转移。该指令
对 IP 的修改范围为:-128~127
jcxz 标号:如果(cs)=0,则转到标号处开始执行,否则顺序向下执行。
11、loop 指令
这是循环指令,所有的循环指令都是短转移,即在段内转移。该指令对 IP 的修改范
即弹出堆栈 sp 中的值作为 ip 的值
retf 指令后,(ip)= (sp),(cs)= (sp)+2,然后(sp) = (sp)+4,即先弹出 ip 的值,
再弹出 cs 的值,即保存时先 push cs,再 push ip,该指令实现远转ll 标号:把本指令(指 call 标号)下一条指令的 ip 压入 sp,并转到标号处执行。
存就是 ss:sp 指向的内存 5、cx 计数寄存器,主要是存储循环程序要循环执行的次数。存放程序在内存中的
长度? 6、注意段寄存器 cs,ds,ss 均不能直接将数据输入。 7、在 mov ax,[si+di]这个[。。。]省略号只能填入如下四个寄存器:bx,si,di,bp,
其余的比如 ax,cx,dx 均是错误的,要是 ss,cs,ds,更是错误的。 在[。。。]中使用 bp,则段地址默认为 ss,显性指示段地址除外。 三、内存相关部分参见二 1、 a、mov al,[ax],其中的 al 指明是字节操作,即一次只移动一个字节的内存 mov ax,[0],其中的 ax 指明是字操作,即一次移动一个字的内存 b、若没有寄存器,则可以使用 word ptr 标明是字操作,这是在 masm 中的用法,比
高位放在 dx 中,低位放在 ax 中,其值为 dx*16+ax
相关主题