汇编语言 第8章 数据处理的两个基本问题

处理数据时有两个基本问题:

  • 处理的数据存储在什么地方?
  • 处理的数据有多长?字节、字还是双字?

寄存器bx、bp、di、si,只有这四个寄存器可以用于寄存器间接寻址,它们之间可以特定组合。

用不太标准的语言来说,bx和bp是同一等级,di和si是同一等级且比bx、bp低一级,bx和bp不能同时使用,di和si不能同时使用,那么就分别有四种组合。

汇编语言中数据位置的表达:

  1. 立即数;数字或者字符。1,2000h,'a'
  2. 寄存器;四个通用寄存器都可以单独表示地址,ax、bx、cx、dx
  3. 段地址(SA)+偏移地址(EA);段地址都是默认的,ds、es等。偏移地址的表示有多种方法。
  • 只用立即数,为直接寻址
  • 只用寄存器bx、bp、di、si中的一个,为寄存器间接寻址
  • 只用寄存器bx、bp、di、si中的一个再加上一个立即数,为寄存器相对寻址     也可写成[bx].idata,[bx+idata]
  • 用寄存器bx、bp、di、si中的两个,比如[bx+si]、[bx+di]、[bp+si]、[bp+di],为基址变址寻址
  • 用寄存器bx、bp、di、si中的两个再加上一个立即数,比如[bx+si+idata]、[bx+di+idata]、[bp+si+idata]、[bp+di+idata],为相对基址变址寻址

数据长度的表达:

    1. 操作寄存器时,默认为寄存器长度。mov ax,1 mov al,1分别为字操作和字节操作
    2. 用操作符X ptr指明,其中X为 word 或 byte。例如mov word ptr ds:[0],1指明了是字操作
    3. push和pop指令,默认只进行字操作。

div指令:

    div是除法指令,先普及一下a/b=c……d,其中a是被除数,b是除数,c是商,d是余数

  • 除数,存储在内存单元或者是寄存器中,可以是8位或者16位
  • 被除数,默认放在AX或者DX中。除数是8位时,被除数位16位,在ax中;除数是16位时,被除数为32位,高16位在dx中,低16位在ax中
  • 商和余数,除数为8位时,商存放在AL,余数存放在AH;除数为16位时,商存放在AX,余数存放在DX
  • 格式为 div reg 或 div 内存单元,可以指明长度。div byte ptr ds:[0]

特殊情况时,如果除数为8位,被除数理应为16位,但16位可能无法存放某些较大的被除数,这时只能用AX和DX。

例如100001/100,100为8位数,理应用ax存放100001,但是100001>65535,所以100001的高位存储在DX,低位存储在AX   (dx)*10000H+(ax) = 100001

伪指令dd:

db为 define byte定义字节型数据,dw为 define word定义字型数据,dd为 define double word定义双字型数据

操作符dup:

配合db、dw、dd等数据定义伪指令使用的,用于进行数据的重复。格式如下

数据定义指令  重复次数  dup指令 (重复的内容)重复的内容中的单个数据长度 默认是与数据定义指令的类型相同  db 3 dup (0)  定义了3个字节,内容都是0 (3默认是字节型,如果改成dw,3默认是字型)

db 3 dup (0,1,2) 定义了九个字节,为0、1、2、0、1、2、0、1、2

 

上一篇:ACM模式下C++的输入输出格式模板


下一篇:ACM模板笔记:最长不下降/上升子序列,最长公共子序列(DP)