直接定址表(学习汇编)

1.我们可以使用一种标号,这种标号不但表示内存单元的地址,还表示了内存单元的长度,即表示在此标号处的单元,是一个字节单元,还是字单元,还是双字单元。如

  a:db 1,2,3,4,5,6,7,8             改写为    a   db   1,2,3,4,5,6,7,8

  b:dw  0                          改变为    b     dw   0

使用不带“:”的标号,它们是同时描述内存地址和单元长度的标号。这种标号包含了对单元长度的描述,所以,在指令中,它可以代表一个段中的内存单元。

2.使用这种包含单元长度的标号,可以使我们以简洁的形式访问内存中的数据。以后,我们将这种标号称为数据标号,它标记了存储数据的单元的地址和长度。它不同于仅仅表示地址的地址标号。

 

在其他段中使用数据标号

1.一般来说,我们不在代码段中定义数据,而是将数据定义到其他段中。在其他段中,我们也可以使用数据标号来描述存储数据的单元的地址和长度。

2.注意,在后面加有“:”的地址标号,只能在代码段中使用,不能再其他段中使用。

3.注意,如果想在代码段中直接用数据标号访问数据,则需要用伪指令assume将标号所在的段和一个段寄存器联系起来。否则编译器在编译的时候,无法确定标号的段地址在哪一个寄存器中。当然,这种联系是编译器需要的,但绝对不是说,我们因为编译器的工作需要,用assume指令将段寄存器和某个段相联系,段寄存器中就会真的存放该段的地址。我们在程序中还要使用指令对段寄存器进行设置。

4.可以将标号当做数据来定义,此时,编译器将标号所表示的地址当做数据的值。

5.seg操作符,功能为取得某一标号的段地址。

附上一个用直接定址表来计算sin(x)的程序:

 1 assume cs:code
 2 code segment
 3 start:
 4         mov al,60
 5         call showsin
 6
 7         mov ax,4c00h
 8         int 21h
 9
10 showsin:
11         jmp short show
12         table dw ag0,ag30,ag60,ag90,ag120,ag150,ag180
13         ag0 db ‘0‘,0
14         ag30 db ‘0.5‘, 0
15         ag60 db ‘0.866‘, 0
16         ag90 db ‘1‘,0
17         ag120 db ‘0.866‘,0
18         ag150 db ‘0.5‘,0
19         ag180 db ‘0‘,0
20
21 show :
22         push bx
23         push es
24         push si
25         mov bx,0b800h
26         mov es,bx
27
28         mov ah,0
29         mov bl,30
30         div bl
31         mov bl,al ;角度/30作为table偏移,商al放到bl中
32         mov bh,0
33         add bx ,bx   ;因为dw每个占2字节,0-1,,1-2 ...
34         mov bx,table[bx]
35         mov si,160*23+40*2
36 shows:
37         mov ah,cs:[bx]
38         cmp ah,0     ;ah是否为0,是则跳转至showret
39         je showret
40         mov es:[si],ah
41         inc bx
42         add si,2
43         jmp shows
44
45 showret:
46         pop si
47         pop es
48         pop bx
49         ret
50
51
52
53 code ends
54 end start 

直接定址表(学习汇编),布布扣,bubuko.com

时间: 2024-10-07 05:26:59

直接定址表(学习汇编)的相关文章

汇编入门学习笔记 (十四)—— 直接定址表

疯狂的暑假学习之  汇编入门学习笔记 (十四)-- 直接定址表 参考: <汇编语言> 王爽 第16章 1. 描述单元长度的标号 普通的标号:a,b assume cs:code code segment a:db 1,2,3,4,5,6,7,8 b:dw 0 start: mov si,offset a mov di,offset b mov ah,0 mov cx,8 s: mov al,cs:[si] add cs:[di],ax inc si loop s mov ax,4c00h in

int指令(学习汇编)

int指令 格式:int n n为中断类型码,它的功能是引发中断过程. CPU执行int n指令,相当于引发一个n号中断的中断过程,执行过程如下: 1)取中断类型码n: 2)标志寄存器入栈,IF=0,TF=0: 3)CS.IP入栈 4)(IP)=(n*4),(CS)=(n*4+2) 从此处转去执行n号中断的中断处理程序. 可以在程序中使用int指令调用任何一个中断的中断处理程序. assume cs:code code segment start:    mov ax,0b800h move s

内中断(学习汇编)

中断的意思是指,CPU不再接着(刚执行完的指令)向下执行,而是转去处理这个特殊信息. 注意,这里所说的中断信息,是为了便于理解而采用的一种逻辑上的说法.它是对几个具有先后顺序的硬件操作所产生的事件的统一描述. “中断信息”是要求CPU马上进行某种处理,并向所要进行的该种处理提供了必备的参数的通知信息. 中断信息可以来自CPU的内部和外部. 内中断的产生 对于8086CPU,当CPU内部有下面的情况发生的时候,将产生相应的中断信息: 1) 除法错误,比如:执行div指令产生的除法溢出: 2) 单步

答复学习汇编不顺利的准大学生

[来信] 老师.我是一名准软件工程大学生..我高2时学了C语言(皮毛),还有Java一部分,由于这样,高中成绩差,高3几乎没接触,暑假,我就网购一本汇编语言(我想学软件破解),看了3/4有人说就可以了我就开始学,发现教程根本就授人以鱼.失望了,就买了本c++ primer plus看了8章,然而学校开学开始学的是C语言,听说汇编语言对编程很有帮助,我就又想重学汇编,想到我校不需要学汇编,很矛盾.不知道怎么办 [回复] 很高兴能看到你有机会学习你感兴趣的专业.在你即将踏入大学校园之际,我想告诉你,

使用BIOS进行键盘输入和磁盘读写(学习汇编)

1.键盘输入将引发9号中断,BIOS提供了int 9中断例程.CPU在9号中断发生后,执行int 9中断例程,从60h端口读出扫描码,并将其转化为相应的ASCII码或状态信息,存储在内存的指定空间(键盘缓冲区或状态字节)中.一般的键盘输入,在CPU执行完int 9中断例程后,都放到了键盘缓冲区中.键盘缓冲区有16个字单元,可以存储15个按键的扫描码和对应的ASCII码. 2.下面,我们通过下面几个键: A.B.C.D.E.shift_A.A 的输入过程,简要地看一下int 9中断例程对键盘输入的

更灵活的定位内存地址的方法(学习汇编)

1.and指令:逻辑与指令,按位进行与运算.与1不变,与0变0,可将对象相应位设为0. 2.or指令:逻辑或指令,按为进行或运算.或1变1,或0变0,可将对象位设为1. 3.[BX+idata]的几种表现形式: mov ax,[200+bx] mov ax,200[bx] mov ax,[bx].200 4.SI和DI是8086CPU中和Bx功能相似的寄存器,只是不能分成两个8位的寄存器来用. 5.[BX+SI]进行内存地址定位的几种形式: mov ax,[bx][si] mov ax,[bx+

端口(学习汇编)

1.在访问端口的时候,CPU通过端口地址来定位端口.因为端口所在的芯片和CPU通过总线相连,所以,端口地址和内存地址一样,通过地址总线来传送. 2.在PC系统中,CPU最多可以定位64KB个不同的端口,则端口地址的范围为0~65535 3.对端口的读写不能用mov,push.pop等内存读写指令.端口的读写指令只有两条:in和out,分别用于从端口读写数据和往端口写入数据. 4.在in和out指令中,只能使用ax或al来存放从端口中读入的数据或要发送到端口中的数据. 5.访问8位端口时用al,访

标志寄存器(学习汇编)

15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 NT IOPL OF DF IF TF SF ZF AF PF CF 未使用 嵌套标志 I/O权限标志占2位 溢出标志 方向标志 中断允许标志 单步标志 符号标志 零标志 未使用 辅助标志 未使用 奇偶标志 未使用 进位标志 1.CPU内部的寄存器中,有一种特殊的寄存器(对于不同的处理机,个数和结构都有可能不同)具有以下3种作用. (1)用来存储相关指令的某些执行结果: (2)用来为CPU执行相关指令提供行为依据: (3

栈Stack和段寄存器SS,SP(学习汇编)

1. 栈有2个基本操作:入栈.出栈 2. 栈顶的元素总是最后入栈,最先出栈:后进先出. 3. 8086CPU提供入栈和出栈的指令,最基本的两个是 PUSH(入栈) 和 POP(出栈) push ax 表示将AX寄存器的内容送入栈中, pop ax 表示从栈顶取出数据送入AX寄存器中.     8086CPU的入栈和出栈操作都是以字(word)为单位的. 4. 8086CPU中,段寄存器SS:存放栈顶段地址,段寄存器SP: 存放栈顶的偏移地址. 5. 任意时刻:SS:SP 指向栈顶元素. 6. 8