x86汇编语言-从实模式到保护模式----第六章

  • movsb和movsw指令:这两个指令没有操作数,通常用于把数据从内存的一个地方批量地传送到另一个地方。movsb以字节为单位,movsw以字为单位。
    原始数据串的段地址为DS,偏移地址SI。目标地址由ES:DI决定。传送的字节数或字数由CX指定。此外,还要指定是正向传送还是反向传送。正向传送指从低地址端到高地址端。正向传送时,每传送一个字节or字,SI和DI都加1或加2,反向反之。每传送一次,CX减1。
  • cld是无操作数指令,方向标志清零,表示方向为正。与之相反的是std,将DF置1。
  • 指令前缀rep,意思是CX不为0就重复。
  • 循环指令loop:将寄存器CX的值减1,如果CX的值不为0,转移到指定的位置处继续执行,否则顺序执行后面的命令。
    对于指令:
    loop digit

    在编译阶段,编译器用标号digit所在的汇编地址减去loop指令的汇编地址,再减去loop指令的长度(2)来得到。

  • 在8086中,如果用寄存器来提供偏移地址,只能使用BX、SI、DI、BP,不能使用其他寄存器。如下面的指令都是非法的:
    mov [ax],dl
    mov [dx],bx
  • inc指令和dec指令:一个操作数,速度比add更快。
  • neg指令:一个操作数,用0减去指定的操作数,即求补运算。
  • 伪指令db、dw等也可以用于有符号整数
  • 8086只允许以下几种基址寄存器和变址寄存器的组合:
    [bx+si]
    [bx+di]
    [bp+si]
    [bp+di]

    这些组合可以用于任何带有内存操作数的指令中。

  • 指令
    jns show

    的意思是,如果未设置标志位,则跳转到show处执行。标志寄存器中有符号位SF。如计算结果最高位为0,则将SF=0,否则SF=1

  • 标志位小结:
    奇偶标志位PF:运算结果出来后,如果最低8位中,有偶数个为1的比特,则PF=1,否则PF=0
    进位标志CF:算术运算中,如果有最高位向前进位或借位的情况,则CF=1,否则CF=0
    溢出标志OF:假定进行有符号数运算,结果超出了目标操作数的容纳范围,则OF=1,否则OF=0
    有符号位SF:如算术逻辑运算结果最高位为0,则将SF=0,否则SF=1
  • 比较指令:两个操作数,不能同时为内存单元。如:
    cmp al,0x08
    cmp dx,bx
    cmp [label_a],cx

    cmp指令会影响CF、OF、SF、ZF、AF、PF标志位。

  • jcxz指令(jump if cx is zero):如果CX=0时则跳转
  • $和$$:$等同于该行的标号;$$代表当前汇编节(段)的起始汇编地址。
  • 书上源代码
             ;代码清单6-1
             ;文件名:c06_mbr.asm
             ;文件说明:硬盘主引导扇区代码
             ;创建日期:2011-4-12 22:12 
          
             jmp near start
             
      mytext db 'L',0x07,'a',0x07,'b',0x07,'e',0x07,'l',0x07,' ',0x07,'o',0x07,\
                'f',0x07,'f',0x07,'s',0x07,'e',0x07,'t',0x07,':',0x07
      number db 0,0,0,0,0
      
      start:
             mov ax,0x7c0                  ;设置数据段基地址 
             mov ds,ax
             
             mov ax,0xb800                 ;设置附加段基地址 
             mov es,ax
             
             cld
             mov si,mytext                 
             mov di,0
             mov cx,(number-mytext)/2      ;实际上等于 13
             rep movsw
         
             ;得到标号所代表的偏移地址
             mov ax,number
             
             ;计算各个数位
             mov bx,ax
             mov cx,5                      ;循环次数 
             mov si,10                     ;除数 
      digit: 
             xor dx,dx
             div si
             mov [bx],dl                   ;保存数位
             inc bx 
             loop digit
             
             ;显示各个数位
             mov bx,number 
             mov si,4                      
       show:
             mov al,[bx+si]
             add al,0x30
             mov ah,0x04
             mov [es:di],ax
             add di,2
             dec si
             jns show
             
             mov word [es:di],0x0744
    
             jmp near $
    
      times 510-($-$$) db 0
                       db 0x55,0xaa

     

转载于:https://www.cnblogs.com/hlk09/p/9783970.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值