王爽第3版《汇编语言》讲稿16.ppt
《王爽第3版《汇编语言》讲稿16.ppt》由会员分享,可在线阅读,更多相关《王爽第3版《汇编语言》讲稿16.ppt(57页珍藏版)》请在三一文库上搜索。
1、汇编语言课件,王爽 著清华大学出版社,制作工具:Microsoft PowerPoint2003,本课件由汇编网()制作提供,第16章 直接定址表,16.1 描述了单元长度的标号 16.2 在其他段中使用数据标号 16.3 直接定址表 16.4 程序入口地址的直接定址表,引言,这一章,我们讨论如何有效合理地组织数据,以及相关的编程技术。,16.1 描述了单元长度的标号,本章中,我们要用到这种标号,先进行如下介绍。 前面的课程中,我们一直在代码段中使用标号来标记指令、数据、段的起始地址。,16.1 描述了单元长度的标号,比如:下面的程序将code 段中的a 标号处的8个数据累加,结果存储到b标号
2、处的字中。 程序代码,16.1 描述了单元长度的标号,assume cs:code code segment a : db 1,2,3,4,5,6,7,8 b : dw 0 start :mov si,offset a mov bx,offset b mov cx,8 s : mov al,cs:si mov ah,0 add cs:bx,ax inc si loop s mov ax,4c00h int 21h code ends end start,16.1 描述了单元长度的标号,程序中,code、a、b、start、s都是标号。这些标号仅仅表示了内存单元的地址。 但是,我们还可以使用一种
3、标号,这种标号不但表示内存单元的地址,还表示了内存单元的长度,即表示在此标号处的单元,是一个字节单元,还是字单元,还是双字单元。 上面的程序我们还可以写成这样:程序,16.1 描述了单元长度的标号,assume cs:code code segment a db 1,2,3,4,5,6,7,8 b dw 0 start : mov si,0 mov cx,8 s : mov al,asi mov ah,0 add b,ax inc si loop s mov ax,4c00h int 21h code ends end start,16.1 描述了单元长度的标号,我们在code 段中使用的标号
4、a、b后面没有“:” ,它们是同时描述内存地址和单元长度的标号。 标号a,描述了地址code:0,和从这个地址开始,以后的内存单元都是字节单元; 而标号b描述了地址code:8,和从这个地址开始,以后的内存单元都是字单元。,16.1 描述了单元长度的标号,因为这种标号包含了对单元长度的描述,所以,在指令中,它可以代表一个段中的内存单元。 比如,对于程序中的b dw 0。 指令:mov ax,b 相当于:mov ax,cs:8 指令:mov b,2 相当于:mov word ptr cs:8,2 指令:inc b 相当于:inc word ptr cs:8 在这些指令中,标号b 代表了一个内存单
5、元,地址为code:8 ,长度为2 字节。,16.1 描述了单元长度的标号,下面的指令会引起编译错误: mov al,b 因为b代表的内存单元是字单元,而al 是8 位寄存器。 如果我们将程序中的指令:add b,ax ,写为add b,al,将出现同样的编译错误。,16.1 描述了单元长度的标号,对于程序中的a db 1,2,3,4,5,6,7,8 : 指令:mov al,a si 相当于:mov al,cs:0si 指令:mov al,a3 相当于:mov al,cs:03 指令:mov al,abx+si+3 相当于:mov al,cs:0bx+si+3,16.1 描述了单元长度的标号,
6、可见,使用这种包含单元长度的标号, 可以使我们以简洁的形式访问内存中 的数据。 以后,我们将这种标号称为数据标号。 它标记了存储数据的单元的地址和长度。 它不同于仅仅表示地址的地址标号。,特别提示,检测点16.1(page289) 没有通过此检测点,请不要向下进行!,16.2 在其他段中使用数据标号,一般来说,我们不在代码段中定义数据,而是将数据定义到其他段中。 在其他段中,我们也可以使用数据标号来描述存储数据的单元的地址和长度。 注意:在后面加有“:”的地址标号,只能在代码段中使用,不能在其他段中使用。,16.2 在其他段中使用数据标号,右面的程序将data 段中 a标号处的 8 个数据累加
7、,结果存储到 b标号处的字中。,assume cs:code,ds:data data segment a db 1,2,3,4,5,6,7,8 b dw 0 data ends code segment start: mov ax,data mov ds,ax mov si,0 mov cx,8 s: mov al,asi mov ah,0 add b,ax inc si loop s mov ax,4c00h int 21h code ends end start,16.2 在其他段中使用数据标号,注意,如果想在代码段中,直接用数据标号访问数据,则需要用伪指令assume 将标号所在的段和
8、一个段寄存器联系起来。 否则编译器在编译的时候,无法确定标号的段地址在哪一个寄存器中。,16.2 在其他段中使用数据标号,当然,这种联系是编译器需要的,但绝对不是说,我们因为编译器的工作需要,用 assume 指令将段寄存器和某个段相联系,段寄存器中就会真的存放该段的地址。 我们在程序中还要使用指令对段寄存器进行设置。,16.2 在其他段中使用数据标号,比如:在上面的程序中,我们要在代码段code中用 data段中的数据标号 a、b 访问数据,则必须用 assume 将一个寄存器和data 段相联。 在程序中,我们用 ds寄存器和 data 段相联,则编译器对相关指令的编译如下: 指令:mov
9、 al,asi 编译为:mov al,si+0 指令:add b,ax 编译为:add 8,ax,16.2 在其他段中使用数据标号,因为这些实际编译出的指令,都默认所访问单元的段地址在ds中,而实际要访问的段为data,所以,若要访问正确,在这些指令执行前,ds 中必须为 data 段的段地址。 则,我们在程序中使用指令: mov ax,data mov ds,ax 设置ds指向data段。,16.2 在其他段中使用数据标号,我们可以将标号当作数据来定义,此时,编译器将标号所表示的地址当作数据的值。 比如: data segment a db 1,2,3,4,5,6,7,8 b dw 0 c
10、dw a,b data ends 数据标号c处存储的两个字型数据为标号a、b 的偏移地址。,16.2 在其他段中使用数据标号,相当于: data segment a db 1,2,3,4,5,6,7,8 b dw 0 c dw offset a, offset b data ends,16.2 在其他段中使用数据标号,再比如: data segment a db 1,2,3,4,5,6,7,8 b dw 0 c dd a,b data ends 数据标号c处存储的两个双字型数据为标号a的偏移地址和段地址、标号b 的偏移地址和段地址。,16.2 在其他段中使用数据标号,相当于: data seg
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 汇编语言 王爽第 讲稿 16
链接地址:https://www.31doc.com/p-2914816.html