龙龙 发表于 2015-6-22 03:00:14

汇编语言笔记 (第八章)

  首先是寄存器了,这里我们统计下之前所学的寄存器
  首先四个:ax,bx,cx,dx,
  si,di,sp,ip,(bp),(pws)
  cs,ds,ss,(es)
  其中:ax,bx,cx,dx,这四个可分为高低8位寄存器
  如ah,al....
  其中cx 用来计算循环次数
  bx一般当做偏移地址来说时,段地址在ds中
  其中cs,ds,ss,es这四个为段寄存器
  cs和ip为组合,          定义指令指针
  ss和sp为组合,          定义栈
  ds和bx,si,di组合,定义数据
  关于es以后再说
  bp下面说
  pws以后再说
  其中si,di与bx功能相似,作为偏移地址时,段地址都在ds中
  不一样的是不能向bx一样可以划分为单独的两个8位寄存器
  十四个寄存器中,唯一没有接触过的是:es段寄存器,pws寄存器
  bp寄存器
  说了这么说,就介绍下bp寄存器
  bp寄存器,实际上和sp很相似,默认段地址都在ss中,BP可以间
  接寻址寄存器而SP不能以外,其余的功能基本相同
  如:
  mov ax,
  就等于:
  ax=ss*16+(bp)
  关于,bx,bp,si,di四个寄存器的配合
  很多人晕,我是这样记的:
  假设:
  bx和bp是两个男人,像我一样帅!呵呵,bx是我本人,bp就是你
  了,他们名字的姓分别是bx姓ds      bp姓ss
  si和di是两个女孩 很漂亮是亲姐妹,比如si是丁丁(人名),di是斜阳(人名),等
  下封ID了...
  idata呢,就是小三了,像谁呢?你猜
  一共5个人哈!记好!
  根据我多年对易术天圆地方的研究!以及我多年的物理学经验,终
  于得出一个结论:正负相吸,相同排斥的原理!
  男女搭配的常规的四种搭配方式:
  
  
  分别是:我和丁丁,我和斜阳            
  
  
  分别是:你和丁丁,你和斜阳
  当然,如果想搞小三的话,那可以加上idata,甲鱼(人名)常常
  
  多少个idata,谁知道呢???
  如:
  
  那这样就是,我和丁丁,外加小三....这种三人关
  系还是可以的,我喜欢....
  你有钱的话,还可以多找几个小三,像甲鱼一样:
  
  注意:绝不允许两个男人娶一个老婆,如:
  
  如,我和甲鱼和丁丁,这样甲鱼是肯定不会愿意的
  ,所以甲鱼只好走了,就剩我和丁丁,如:
  当然这个时间
  我还可以找个小三 ,如
  但是不能找斜阳了,不然就乱伦了...那就是
  这样绝对不
  行
  还有就是连同小三我们五个人都单身一辈子,都单身一辈可以5个
  单独出现,所以说:
  亲!你是不是经常男女搭配啊!
  亲!你是不是经常乱伦啊!
  亲!你是不是经常同性恋啊!
  亲!你是不是经常包小三啊!
  亲!你是不是经常单身啊!
  有木有???
  还有就是si和di不能一起,因为乱伦了!
  注意:si可以单独和idata在一起,哎!这个关系怎么可以?设计
  CPU的人啊!伤不起...
  最后讨论下生出孩子的问题,主要是孩子姓什么?
  注意一点:
  
  
  
  很多人认为,bp段地址在ss,di或者si段地址在ds
  这样是错误的!
  只要bp出现,那就是统一段地址在ss中
  这样理解:
  bp和bx说了是男人,si和di是女人,
  夫唱妇随,孩子出生肯定跟随bp的姓了,那就是段地址在ss
  idata是小三!
  呵呵,肯定也是男的是bp就跟ss,是dx就跟ds
  如果小三和si与di在一起了,那就跟si和di的姓,也是ds
  说下数据处理和数据有关的方面
  首先cpu处理数据,一般不关心数据值是多少,而是关心数据所在
  位置,一般有三种操作,读,写,运行
  一般数据在三个位置:
  内存地址 如:mov ax,或mov ax,
  cpu内部,如寄存器中,指令缓冲器...mov ax,bx或者mov ax,1
  端口 暂时不说
  数据进行运算时,一般不需要指定数据运算的单位,如字还是字节
  那是因为很多运算使用了寄存器
  如:mov ax,bx默认就是字运算如mov ax,1122h
  注意:mov ax,12h也是字运算,不要看只有12h就以为是字节运算
  其实编译器当0012h
  mov al,bl   默认是字节运算如 mov al,22h
  push和pop默认是字运算
  如果在没有指定寄存器的情况下,不指定运算单位,就是要出错的
  程序如下:
  假设数据:
  ds:0   11 22 00 00....
  我们修改11为33,就是 33 22 00 00...
  原来程序如下:
  assume cs:qq,ds:ee
  ee segment
  db 11h,22h
  ee ends
  qq segment
  start:
  mov ax,ee
  mov ds,ax
  mov bx,0
  mov ,33h
  mov ax,4c00h
  int 21h
  qq ends
  endstart
  这样的话,结果是
  ds:0   33 00 00 00
  我们虽然修改了11,但同时也把22给修改了
  因为此时没有出现寄存器,所以cpu就认为是字运算了
  ,如果我们要单独修改11的话,那就用一条新指定
  XX ptr
  解析:xx可以是word或者byte...
  如字运算: mov word ptr,33h
  如字节运算:mov byte ptr,33h
  这样的话,我们改进上面的程序,把mov ,33h
  这一句修改为:mov byte ptr,33h
  程序结果如下:
  ds:033 22 00 00
  这样就做到没有修改到22这个数据!
  关于寻址方式加定义处理数据单位的综合因为:
  我就写了个最简单的例子,没有用到循环和别的,就是让大家
  更明了
  assume cs:qq,ds:ee
  ee segment
  db'IBM'
  db'100'
  db'PDF'
  db'in'
  ee ends
  qq segment
  start:
  mov ax,ee
  mov ds,ax
  mov bx,0
  mov byte ptr,'0'
  mov byte ptr,'1'
  mov byte ptr,'0'
  mov byte ptr,'d'
  mov byte ptr,'o'
  mov byte ptr,'c'只修改一个字节
  mov word ptr,'hh'同时修改1个字
  mov ax,4c00h
  int 21h
  qq ends
  end start
  好了,第八章上半部分就说的这里!
  第八章:
  DIV命令
  除法命令
  说下我们之前学过的运算
  add 加sub减inc自加1div除
  了解基本除法运算
  9/2=4...1
  9是被除数
  2是除数
  4是商
  1是余数
  在8086汇编中,除数可能有8位与16位两种
  除数为8位时,被除数为16位,默认放在ax寄存器中
  商则放在al中,余数放在ah中
  例:
  div byte ptr
  商al=(ax)/(ds*16+bx)
  余ah=(ax)/(ds*16+bx)
  如果除数为16位时,被除数为32位,默认放在ax和dx中,
  其中bx存放高16位,ax存放低16位
  商则放在ax中,余数则放在dx中
  例:
  div word ptr
  商ax=(dx*10000H+ax)/(ds*16+bx+si+6)
  余dx=(dx*10000H+ax)/(ds*16+bx+si+6)
  这里的10000H解析下:
  如果32位数据为:
  AABBCCDD
  那么AABB放在bx寄存器中
  CCDD放在ax寄存器中
  那么AABB*10000H时,也就是等于AABB0000
  这个时间加上ax的值,那就是AABBCCDD
  注意,一定要拿word ptr或者byte ptr指明是字节
  还是字操作,也就是8位还是16位   
  举个例子
  1000/101=9...101
  程序如下:
  assume cs:qq,ds:ee
  ee segment
  db 65h;65h即等于十进制101
  ee ends
  qq segment
  start:
  mov ax,ee
  mov ds,ax
  mov ax,3E8h ;3E8h即等于十进制1000
  mov bx,0
  div byte ptr
  mov ax,4c00h
  int 21h
  qq ends
  end start
  结果:ax=5B09
  其中al=09即是商 ,十进制也是9
  ah=5B即是余数 5Bh即十进制101
  伪指令dd
  其实前面我们说过了,
  db定义字节    8位
  dw定义字   16位
  dd定义双字32位
  dup这个命令很有用,大家在使用一段干净内存空间时
  可以用它来定义
  dup功能:
  XX y dup(a,b,c)
  其中XX可以是dd,dw,db...
  y即是重复的次数
  括号内部的a,b,c即是要重复的内容
  如
  db 3 dup(11,22)
  执行后,相当于
  db 11,22,11,22,11,22
  关于实验7,我用了一个笨方法下了出来,虽然笨,但是几乎用到
  了前面的所有的知识
  我把代码写下来
  assume cs:qq,ds:ee
  ee segment
  db '1991','1992','1993','1994','1995','1996'
  dd 16,22,382,1356,8000,5937000
  dw 3,7,9,13,38,30000,17800
  ee ends
  ;qq段开始
  qq segment
  start:
  mov ax,ee
  mov ds,ax
  mov ax,1000h
  mov ss,ax
  ;年份计算
  mov bp,0
  mov bx,0
  mov si,0
  mov cx,6
  s:
  mov es,cx
  mov cx,4
  s1:
  movword ptr ax,
  movword ptr ,ax
  inc bx
  inc bp
  loop s1
  mov cx,es
  add si,12
  loop s
  ;中间空格
  mov bp,0
  mov cx,6
  s2:
  mov byte ptr ,0
  add bp,16
  loop s2
  ;收入计算
  mov cx,6
  mov bx,18h
  mov si,0
  mov bp,0
  s3:
  mov es,cx
  mov cx,2
  s4:
  mov word ptr ax,
  mov word ptr ,ax
  add bx,2
  add bp,2
  loop s4
  mov cx,es
  add si,12
  loop s3
  ;中间空格
  mov bp,0
  mov cx,6
  s5:
  mov byte ptr ,0
  add bp,16
  loop s5
  ;雇员数计算
  mov cx,6
  mov bx,30h
  mov si,0
  mov bp,0
  s6:
  mov es,cx
  mov cx,1
  s7:
  movax,
  mov ,ax
  add bx,2
  inc bp
  loop s7
  mov cx,es
  add si,15
  loop s6
  ;中间空格
  mov bp,0
  mov cx,6
  s8:
  mov byte ptr ,0
  add bp,16
  loop s8
  ;最后的空格
  mov bp,0
  mov cx,6
  s9:
  mov byte ptr ,0
  add bp,16
  loop s9
  ;除法运算,商保存偏移OD处,余保存0E处
  mov bp,0
  mov cx,6
  mov si,0
  ps:
  mov bx,0
  mov ax,
  mov dx,
  div word ptr
  mov ,ax
  mov ,dx
  add si,16
  loop ps
  ;结束
  mov ax,4c00h
  int 21h
  qq ends
  end start
  书上原题,答案是这样的:
  assume cs:code,ds:data,es:table
  data segment
  db '1975','1976','1977','1978','1979','1980','1981','1982','1983'
  db '1984','1985','1986','1987','1988','1989','1990','1991','1992'
  db '1993','1994','1995'
  dd 16,22,382,1356,2390,8000,16000,24486,50065,97479,140417,197514
  dd 345980,590827,803530,1183000,1843000,2759000,3753000,4649000,5937000
  dw 3,7,9,13,28,38,130,220,476,778,1001,1442,2258,2793,4037,5635,8226
  dw 11452,14430,15257,17800
  data ends
  table segment
  db 21 dup ('year summ ne ?? ')
  table ends
  code segment
  start:mov ax,data
  mov ds,ax
  mov ax,table
  mov es,ax
  mov bx,0
  mov si,0
  mov di,0
  mov cx,21
  s:      mov ax,
  mov es:,ax
  mov ax,.2
  mov es:.2,ax
  mov ax,.84
  mov es:.5,ax
  mov dx,.86
  mov es:.7,dx
  div word ptr ds:.168
  mov es:.13,ax
  mov ax,.168
  mov es:.10,ax
  add di,2
  add bx,4
  add si,16
  loop s
  mov ax,4c00h
  int 21h
  code ends
  end start
页: [1]
查看完整版本: 汇编语言笔记 (第八章)