java打印对象内存地址 分布式事务 事务消息 分布式事务 几种解决方案 分布式事务-Seata 分布式事务-Seata 分布式事务-LCN-TCC 分布式事务-LCN 分布式事务-消息队列-定时任务-本地事件表 Zuul网关实战02 Zuul网关实战01 灰度发布落地实战2 灰度发布落地实战1 Gsnova on Heroku build Systemd Debian system initialization manage multi id_rsa ubuntu 64bits cannot run 32bits app REHL power auditing Debug Assembly for ARMv8 on QEMU ARM体系结构--寄存器 Run Debian iso on QEMU ARMv8 QEMU ARM64 guide cross compiler install buildroot install QEMU install python入门--数据结构 python入门--内置数据类型 python入门--类 异常 python入门--条件表达式 方法 python入门--数字 字符串 数组 RTC驱动分析 块设备驱动 TCP UDP socket 触摸屏驱动 USB驱动 LED按键中断 LCD 驱动 驱动信号 根文件系统 实验 内核实验 字符设备驱动程序 绪论 uboot 实验 LCD 实验 系统时钟和UART 中断控制器 Nand Flash控制器 MMU 实验 储存管理器实验 GPIO实验 点亮LED 编译加载驱动 制作烧写内核 dnw替代方法 MINI2440 TQ2440安装配套Linux 使用NFS 制作烧写跟文件系统 grub引导Windows 烧写裸版程序-linux Ubuntu 网络没有 eth0 Linux自动挂载 烧写裸板程序 电路基础 Mac词典 Vim插件 Assembly 综合研究 Assembly 指令总结 Assembly 直接定址表 Assembly 使用BIOS进行键盘输入和磁盘读写 Assembly 外中断 Assembly 端口 Assembly int指令 Assembly 内中断 Assembly 标志寄存器 Assembly 转移指令的原理 Assembly Call和ret指令 Assembly 数据处理两个基本问题 Assembly 灵活定位内存地址 Assembly 包含多个段的程序 Assembly [bx] loop Assembly 第一个程序 Assembly 寄存器 (内存访问) Assembly 寄存器 AWS VPN with EC2 hidden file in picture(linux) Assembly 基础 idea shortcuts 常用快捷键 idea plugin folder install ruby and jekyll

Assembly 直接定址表

2014年10月04日

有效的合理的组织数据的编程技巧

###描述了单元长度的标号(数据标号)

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,a[si]	  
  		mov ah,0
  		add b,ax
  		inc si
  		loop s
  		
  		mov ax,4c00h
  		int 21h	  
	code ends
end start

在code段中,标号a,b后面,没有“:”,它们是同事描述内存地址和单元长度的标号

这种标号不但表示内存单元的地址,还表示了内存单元的长度(此单元是一个字单元还是字节单元)

###在其他段中使用数据标号 注意,后面加有“:”的地址标号,只能在代码段中使用,不能在其他段中使用

其他段使用数据标号,需要使用伪指令assume关联,这种联系是编译器需要的:

assume cs:code,ds:data

data segment
	a db 1,2,3,4,5,6,7,8
	b dw 0
data ends

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

data segment
	a db 1,2,3,4,5,6,7,8
	b dw 0
	c dw a,b	;相当于 c dw offset a,offset b
	d dd a,b	;相当于 d dd offset a,seg a,offset b,seg b
data ends

数据标号 c 处存储的两个字型数据为标号 a、b 的偏移地址

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

###直接定址表

start:jmp short begin
	  table dw func0,func1,func2	;字符串偏移地址表
	  
begin:mov bl,0	;bl为传入参数,0为调用0号功能,1为调用2号功能
	  mov bh,0
	  add bx,bx	;bl+bl = 0 下面call寻址到table[0]
	  call word ptr table[bx]
	  
	  mov ax,4c00h
	  int 21h
	  
func0:......ret
func1:......ret
func2:......ret

注意,table使用dw定义,即一个字(2字节)

bl为0时,bx+bx=0 用table[0]寻址找到func0子程序

bl为1时,bx+bx=2 用table[2]寻址找到func1子程序

bl为2时,bx+bx=4 用table[4]寻址找到func2子程序

根据功能号查找地址表的方法,程序的结构清晰,易于扩充,如果新加入一个功能,只需要在地址表中加入它的入口地址就可以了