为了正常的体验网站,请在浏览器设置里面开启Javascript功能!

汇编语言总结

2012-02-14 8页 pdf 169KB 56阅读

用户头像

is_427810

暂无简介

举报
汇编语言总结 詹 剑 峰 汇 编 语 言 总 结 1.1.1.1. 典型的汇编编写规范................................................................................................................... 1 1.11.11.11.1文字说明.................................................................................................
汇编语言总结
詹 剑 峰 汇 编 语 言 总 结 1.1.1.1. 典型的汇编编写规范................................................................................................................... 1 1.11.11.11.1文字说明...............................................................................................................................1 1.21.21.21.2例题示范...............................................................................................................................1 2.2.2.2. 寄存器及寻址方式.....................................................................................................................2 2.12.12.12.1寄存器说明...........................................................................................................................2 2.22.22.22.2寻址方式说明.......................................................................................................................2 3.3.3.3. 循环与转移指令.........................................................................................................................3 3.13.13.13.1循环文字说明.......................................................................................................................3 3.23.23.23.2循环例题说明.......................................................................................................................3 3.33.33.33.3 跳转指令..............................................................................................................................4 3.43.43.43.4标志寄存器...........................................................................................................................4 3.53.53.53.5条件转移...............................................................................................................................4 3.63.63.63.6例题示范...............................................................................................................................4 4.4.4.4. 子程序调用规范.........................................................................................................................5 4.14.14.14.1子程序编写规范...................................................................................................................5 4.24.24.24.2例题示范...............................................................................................................................5 5.5.5.5. 中断处理.....................................................................................................................................6 5.15.15.15.1中断处理说明.......................................................................................................................7 5.25.25.25.2中断例题...............................................................................................................................7 1.1.1.1. 典型的汇编编写规范 1.11.11.11.1文字说明 包含段声明,段定义,代码段包含功能段 1.21.21.21.2例题示范 Assem CS:code DS:data SS:stack date segment DB 1,2,3 DW 10 dup (0) DD 5 dup (‘a’) date ends stact segment dw 8 dup (0) stact ends code segment start: mov ax,data mov DS,ax mov ax,stact mov SS,ax mov IP,16h ……………………. mov ax,4c00h int 21h code ends end start 詹 剑 峰 汇 编 语 言 总 结 2.2.2.2. 寄存器及寻址方式 2.12.12.12.1寄存器说明 si,di,dx,bp:si,di,dx,bp:si,di,dx,bp:si,di,dx,bp:si,di不能分解成两个 8位寄存器使用,同时 si,di不能同时使用,一样 dx,bp 也不能同时使用[di][si] 及[dx][bp]是错误的达式,[bx]默认是 ds 的偏移量,而[bp]默认是ss 的偏移量,可明确标出 es:[bx] ds:[bp]. 2.22.22.22.2寻址方式说明 2.2.1立即寻址方式 立即数可以是 8位、16位或 32位,该数值紧跟在操作码之后。如果立即数为 16位或 32 位,那么,它将按“高高低低”的原则进行存储。例如: MOV AH, 80H ADD AX, 1234H MOV ECX, 123456H MOV B1, 12H MOV W1, 3456H ADD D1, 32123456H 2.2.22.2.22.2.22.2.2寄存器寻址方式 指令所要的操作数已存储在某寄存器中,或把目标操作数存入寄存器。把在指令中指 出所使用寄存器(即:寄存器的助忆符)的寻址方式称为寄存器寻址方式。 1、源操作数是寄存器寻址方式 如:ADD VARD, EAX ADD VARW, AX MOV VARB, BH 等。 其中:VARD、VARW和 VARB是双字,字和字节类型的内存变量。在第 4 章将会学到如何 定义它们。 2、目的操作数是寄存器寻址方式 如:ADD BH, 78h ADD AX, 1234h MOV EBX, 12345678H 等。 寄存器的分类 寄存器 主 要 用 途 通 用 寄 存 器 数据 寄存器 AX 乘、除运算,字的输入输出,中间结果的缓存 AL 字节的乘、除运算,字节的输入输出,十进制算术运算 AH 字节的乘、除运算,存放中断的功能号 BX 存储器指针 CX 串操作、循环控制的计数器 CL 移位操作的计数器 DX 字的乘、除运算,间接的输入输出 变址 寄存器 SI 存储器指针、串指令中的源操作数指针 DI 存储器指针、串指令中的目的操作数指针 变址 寄存器 BP 存储器指针、存取堆栈的指针 SP 堆栈的栈顶指针 指令指针 IP/EIP 标志位寄存器 Flag/EFlag 32 位 CPU 的 段寄 存器 16 位 CPU 的 段寄存器 ES 附加段寄存器 CS 代码段寄存器 SS 堆栈段寄存器 DS 数据段寄存器 新增加的 段寄存器 FS 附加段寄存器 GS 附加段寄存器 詹 剑 峰 汇 编 语 言 总 结 3、源和目的操作数都是寄存器寻址方式 如:MOV EAX, EBX MOV AX, BX MOV DH, BL 等。 2.2.32.2.32.2.32.2.3直接寻址方式 指令所要的操作数存放在内存中,在指令中直接给出该操作数的有效地址,这种寻址方 式为直接寻址方式。 MOV AX, 1234H MOV AX, [1234H] 前者是立即寻址,后者是直接寻址 MOV AX, VARW MOV AX, [VARW] 两者是等效的,均为直接寻址 2.2.4寄存器间接寻址方式 操作数在存储器中,操作数的有效地址用SI、DI、BX 和 BP 等四个寄存器之一来指定, 称这种寻址方式为寄存器间接寻址方式。 2.2.52.2.52.2.52.2.5寄存器相对寻址方式 操作数在存储器中,其有效地址是一个基址寄存器(BX、BP)或变址寄存器(SI、DI)的内 容和指令中的 8位/16位偏移量之和。 2.2.62.2.62.2.62.2.6基址加变址寻址方式 操作数在存储器中,其有效地址是一个基址寄存器(BX、BP)和一个变址寄存器(SI、DI) 的内容之和。 2.2.72.2.72.2.72.2.7相对基址加变址寻址方式 操作数在存储器中,其有效地址是一个基址寄存器(BX、BP)的值、一个变址寄存器(SI、 DI)的值和指令中的 8位/16 位偏移量之和。 3.3.3.3. 循环与转移指令 3.13.13.13.1循环文字说明 looplooplooploop:指令循环,其实是个由 CX 存放循环次数, 并跳转的指令,每执行一次,CX-1, 并判断是否 CX==0?,等于 0循环结束,否则继续。 3.23.23.23.2循环例题说明 二重循环的处理:对第一重 CX 一定要暂存典型结构: s0: PUSH CX //第一重循环计数入栈 MOV CX,4 //设第二重循环 CX 计数 MOV SI,0 s: …………………… //第二重循环内容 LOOP s //第二重循环 …………………… //第一重循环内容 POP CX //第一重循环计数出栈 LOOP s0 //第一重循环 3.33.33.33.3 .... 跳转指令 jmp:,此指令有多形式与变种,用于实现不同范围的或不同条件的跳 转,或依靠 IP进行跳转,或依靠 IP+CS 跳转 jmp short 标号:段内短转移,对 IP的修改范围是-128~127。机器码中不需要转移 源操作数 指令的变形 源操作数的寻址方式 只有偏移量 MOV AX, [100H] 直接寻址方式 只有一个寄存器 MOV AX, [BX] 或 MOV AX, [SI] 寄存器间接寻址方式 有一个寄存器和偏移量 MOV AX, [BX+100H] 或 MOV AX, [SI+100H] 寄存器相对寻址方式 有二个寄存器 MOV AX, [BX+SI] 基址加变址寻址方式 有二个寄存器和偏移量 MOV AX, [BX+SI+100H] 相对基址加变址寻址方式 詹 剑 峰 汇 编 语 言 总 结 目的地址。 Jmp far ptr 标号:段间转移或远转移,机器码中包含 CS 和 IP。 Jmp reg:( IP)=(16位 reg) Jum word ptr 内存单元地址(段内转移)地址字内容赋给 IP [BX] Jcxz 标号:等值于 if((cx)==0) jmp short 标号; Loop 标号:等值于 (cx)--; if((cx)!=0) jmp short 标号; 3.43.43.43.4标志寄存器 有 16位,所存储的信息通常称为程序状态字。 ZF: 零标志位,记录之前的结果是否为零,为零置 1 PF:奇偶标志位,记录当前结果含有 1 的数目,为偶数置 1,奇数置 0 CF:进位(借位)标志位,产生进位置 1,没产生置 0,对无符号数运算 SF:符号标志位,为负置 1,为正置 0,仅对有符号数有意义 OF:溢出标志位,产生溢出置 1,无溢出置 0,只对有符号数运算而言 DF:方向标志位,为 0,si++,di++;为 1,si--,di--。 TF: =0 用于避免单步执行进入死循环 IF:可屏蔽中断(IF=0,不响应可屏蔽中断,中断处理时通过设置 IF=0 用于禁止其他可 屏蔽中断),不可屏蔽中断(中断类型码固定为 2), 3.53.53.53.5条件转移 根据无符号数进行条件转移。 jejejeje 相等转移(equal) ZF=1 jnejnejnejne 不等转移 ZF=0 jbjbjbjb 小于转移(below) CF=1 jnbjnbjnbjnb 不小于转移 CF=0 jajajaja 大于转移(above) CF=0 且 ZF=0 jnajnajnajna 不大于转移 CF=1 或 ZF=1 3.63.63.63.6例题示范 assume cs:codesg datasg segment db "Beginner's All-purpose Symbolic Instruction Code.",0 datasg ends codesg segment begin: mov ax,datasg mov ds,ax mov si,0 call letterc mov ax,4c00h int 21h letterc: ;子程序部分[开始] push si s0: mov al,[si] cmp al,0 詹 剑 峰 汇 编 语 言 总 结 je exitsub cmp al,61h ;61h 为'a'的 ASCII 码 jb next cmp al,7ah ;7ah 为'z'的 ASCII 码 ja next and al,11011111B ;或使用 sub al,20h mov [si],al next: inc si jmp short s0 exitsub: pop si ret ;子程序部分[结束] codesg ends end begin 4.4.4.4. 子程序调用规范 4.14.14.14.1子程序编写规范 4.1.14.1.14.1.14.1.1 callcallcallcall:与 retretretret相对应 Call 标号= push IP � jmp near ptr 标号 Call far ptr 标号= push CS�push IP�jmp far ptr 标号 Call reg = push IP�jmp reg Call dword ptr 内存单元= push CS�push IP�jmp dword ptr 内存单元 4.1.24.1.24.1.24.1.2 retretretret和 retfretfretfretf 用栈中的数据修改 IP或 IP&CS,用于返回。 ret= (IP)=((ss)*16+(sp)) � (sp)=(sp)+2 retf= (IP)=((ss)*16+(sp)) � (sp)=(sp)+2 � (CS)=((ss)*16+(sp)) � (sp)=(sp)+2 4.24.24.24.2例题示范 callcallcallcall与 retretretret的配合使用:典型的子程序调用 data segment db 'Welcome to masm!',0 data ends code segment assume cs:code,ds:data start: mov dh,1 ;dh 装行号(范围:1--25) mov dl,1 ;dl 装列号(范围:1--80)[注:每超过80 等于行号自动加 1] mov cl,0cah ;cl 中存放颜色属性(0cah为红底高亮闪烁绿色属性) mov ax,data mov ds,ax mov si,0 call show_str 詹 剑 峰 汇 编 语 言 总 结 mov ax,4c00h int 21h show_str: ;显示字符串的子程序[定义开始] push cx push si mov al,0A0h dec dh ;行号在显存中下标从 0开始,所以减 1 mul dh mov bx,ax mov al,2 mul dl sub ax,2 ;列号在显存中下标从 0开始,又因为偶字节存放字符,所以减 2 add bx,ax ;此时 bx中存放的是行与列号的偏移地址 mov ax,0B800h mov es,ax ;es 中存放的是显存的第0 页(共 0--7 页)的起始的段地址 mov di,0 mov al,cl mov ch,0 s: mov cl,ds:[si] jcxz ok mov es:[bx+di],cl ;偶地址存放字符 mov es:[bx+di+1],al ;奇地址存放字符的颜色属性 inc si add di,2 jmp short s ok: pop si pop cx ret ;显示字符串的子程序[定义结束] code ends end start 5.5.5.5. 中断处理 5.15.15.15.1中断处理说明 1.1.1.1.中断:CPU 不再接着向下执行,而转去处理中断信息,所谓中断信息就是由 CPU 内 部产生或有外部传送的,可立即对接收的信息进行处理。 2.2.2.2.内外中断:CPU 为界,cpu内部产生,和 cpu外部传送的中断,先分析内部中断, 内中断的四种情形:除法错误,单步执行,执行 into 指令,执行 int 指令。 3.3.3.3.中断类型码:用于标识中断信息的来源。为一个字节数据,即 256中编码,内部中断 典型的类型码,除法指令:0,单步执行:1,执行 into:4,执行 int指令,该指令格式为 int n,n 为提供给 CPU中断类型码。 4.4.4.4.中断向量表:8 位中断类型码,通过中断向量表找到相应中断处理程序的入口地址, 用于中断类型嘛与中断处理程序的入口地址一一对应,相应成表。表项占两个字,高地址字 存放段地址,低地址存放偏移地址。从 0000:0000 开始存放。 5.5.5.5.中断处理过程: (1) 取得中断类型码 N; 詹 剑 峰 汇 编 语 言 总 结 (2) Pushf 标志寄存器的值入栈 (3) TF=0,IF=0 用于避免单步执行进入死循环 (4) Push CS (5) Push IP (6) (IP)=(N*4),(CS)=(N*4+2) 读取入口地址,设置 IP,CS 6.6.6.6.中断处理程序: (1)保存用到的寄存器 (2)处理中断 (3)恢复用到的寄存器 (4)用 iret指令返回(功能等价: pop IP pop CS popf) 7.int7.int7.int7.int指令 其格式 int N, N 是中断类型码,用于引发相应的中断程序 �取中断类型码�pushf,IF=0,TF=0�push CS,push IP�(IP)=(N*4),(CS)=(N*4+2) 8.8.8.8.中断例程 系统存在一些子程序,其以中断处理程序的方式提供给应用程序调 用,在我们编程时可使用 int来调用这些程序,称为中断例程调用。 9.9.9.9.中断例程编写: �编写实现功能的程序 mul:。。。。。。。。。。。。。。。。。。。。。。。。 mulend:nop �安装程序(movsb),可安装到 0:200处 �设置中断向量表,mov word ptr es:[n*4],200h mov word ptr es:[n*4+2],0 Int指令与 iret就像 call 与 ret 配合使用 5.25.25.25.2中断例题 实验 12 编写 0 号中断的处理程序(第 240页) ------------------------------------- 完整程序如下: assume cs:code code segment start: mov ax,cs mov ds,ax mov si,offset do0 ;设置 ds:si 指向源地址 mov ax,0 mov es,ax mov di,200h ;设置 es:di 指向源地址 mov cx,offset do0end - offset do0 ;设置 cx 为传输长度 cld ;设置传输方向为正 rep movsb ;mov ax,0 ;mov es,ax mov word ptr es:[0*4],200h ;设置中断向量的入口地址的偏移地址 mov word ptr es:[0*4+2],0 ;设置中断向量的入口地址的段地址 mov ax,0f000h mov dx,22d mov cx,10d 詹 剑 峰 汇 编 语 言 总 结 div cx ;此 4 句是为了做个溢出的除法 mov ax,4c00h int 21h do0: jmp short do0start db "divide error!" do0start: mov ax,cs mov ds,ax mov si,202h ;设置 ds:si 指向字符串 mov ax,0B800h mov es,ax mov di,12*0A0h+2*32 ;设置 es:di 指向显存空间的中间位置 mov cx,13d ;设置字符串长度 s: mov al,[si] mov es:[di],al inc si add di,2 loop s mov ax,4c00h int 21h do0end: nop code ends end start
/
本文档为【汇编语言总结】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。 本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。 网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。

历史搜索

    清空历史搜索