8086汇编记录

12 篇文章 0 订阅
8 篇文章 1 订阅

软件的基本操作:
mount c d:\masm
C:
dir
启动:debug  退出:q
    20位       寄存器16位
1、物理地址 = 段地址*16 +  偏移地址
2、AL =AL +BL  如果溢出不可进位
3、寄存器16位,寻址范围为64KB,所以偏移地址寻址范围最大为64KB
4、段寄存器
    CS----代码段    DS---数据段      SS---栈段     ES附加段
    
5、Debug是什么:
    (1)Debug是DOS系统中的著名的调试程序,也可以运行在windows系统实模式下
    (2)使用Debug程序,可以查看CPU各种寄存器中的内容、内存的情况,并且在机器指令集跟踪程序的运行
    
6、Debug能做什么
    (1)用R命令查看、改变CPU寄存器的内容  r      r ax +回车
    (2)用D命令查看内存中的值  d     d 2000:0000      d 2000:0  f     d 2000:0 2f
    (3)用E命令改变内存中的值  e 2000:0000  11 22 33
    (4)用U命令将内存中的机器指令翻译成汇编指令  u 2000:0
    (5)用A命令以汇编指令的格式在内存中写入机器指令 CS:IP    a 073f:0100 +回车+汇编程序 mov ax,bx
    (6)用T命令执行机器指令  t 执行CS:IP指向的汇编程序
    
7、8086PC读取和执行指令:CS代码段寄存器  IP指令指针寄存器
    (1)从CS:IP指向内存单元读取指令,读取的指令进入指令缓冲器;
    (2)IP = IP + 所读取指令的长度,从而指向下一条指令;
    (3)执行指令。转到步骤(1),重复这个过程。
    
8、转移指令jmp 
    (1)同时修改CS,IP的内容
        jmp  段地址:偏移地址   jmp 2AE3:3
        功能:用指令中给出的段地址修改CS,偏移地址修改IP
    (2)仅修改IP的内容
        jmp 某一合法寄存器   jmp ax (类似于mov IP,ax)但是这条指令不存在

9、CPU从内存单元中读取数据:DS和[address]配合
    (1)用DS寄存器存放要访问的数据的段地址
    (2)偏移地址用[...]形式直接给出
    mov bx,1000H  mov ds,bx   mov al,[0]  将10000H(1000:0)中的数据读到al中
    mov bx,1000H  mov ds,bx   mov [0] ,al   将al中的数据写到10000H(1000:0)中

10、套路数据----->一般寄存器------>段寄存器

11、字的传送 8086可以一次性传送16位数据
    mov bx,1000H
    mov ds,bx
    mov ax,[0] ;1000:0处的字型数据送入ax
    mov [0],cx ;cx中的16位数据送到1000:0处
    
12、push入栈:push ax  将ax中的数据入栈 1)SP SP-2; 2)向SS:SP指向的字单元送入数据
    pop出栈:pop ax    将栈顶中取出数据给ax (以字为单位对栈进行操作) 1)从SS:SP指向的字单元中读取数据;2)SP=SP-2
    
    SP栈顶指针
    SS段寄存器
    
    mov ax,1000H
    mov ss,ax
    mov sp,0010H
    
    mov ax,001AH
    mov bx,001BH
    
    push ax
    push bx
    
    pop ax
    pop bx
    
13、用汇编语言编写程序的工作过程:汇编程序---编译器----机器码-----计算机
    assume  cs:codesg       假设 伪指令:没有对应机器码的指令,最终不被CPU执行
    codesg segment           段的开始:段名 +segment
            mov ax,0123H     汇编指令,对应有机器码的指令,可以被编译为机器指令,最终被CPU执行
            mov bx,0456H
            add ax,bx
            add ax,ax
            
            mov ax,4c00h     程序返回(套路!):程序结束后将CPU的控制权交还给使他得以运行的程序
            int 21h
    codesg ends                 段的结束:段名 +ends        
    
    end                         汇编程序结束标记
    
    谁来执行伪指令?伪指令是由编译器来执行的指令,编译器根据伪指令来进行相关编译工作
    
14、编译程序:masm xx.asm;或者masm  xx;

15、连接 link  xx;

16、执行(dos)  xx

17、Debug装载程序:debug xx.exe

18、loop指令: loop +标号
    (1)(cx)=(cx)-1;
    (2)判断cx中的值:不为0则转至标号处执行程序,如果为0则向下执行
    
    assume  cs:codesg       假设 伪指令:没有对应机器码的指令,最终不被CPU执行
    codesg segment           段的开始:段名 +segment
            mov ax,2    汇编指令,对应有机器码的指令,可以被编译为机器指令,最终被CPU执行
            mov cx,11
        s:    add ax,ax
            loop  s
            
            mov ax,4c00h     程序返回(套路!):程序结束后将CPU的控制权交还给使他得以运行的程序
            int 21h
    codesg ends                 段的结束:段名 +ends        
    
    end                         汇编程序结束标记
    
19、段前缀  mov  ax,DS:[0]  //不这样写debug的时候 mov ax,[0],会把[0]当做 0 赋值给ax

20、在代码段中使用数据
    编程计算一下8个数据的和,结果保存在ax中
    assume cs:code
    code segment
            dw 0123H ,0456H ,0789H,0abcH,0defH,0fedH,0cbaH,0987H   //dw定义字数据
    start:mov bx,0      //CS;IP指向此处  start
          mov ax,0
          mov cx,8
          
          s:add ax,cs:[bx]  //从cs:[0]取出数据0123H
            add bx,2
            loop s
            
            mov ax,4c00h
            int 21h
    code ends
    end start
    
21、在代码段中使用栈:倒序存放
    assume cs:code
    code segment
            dw 0123H ,0456H ,0789H,0abcH,0defH,0fedH,0cbaH,0987H   //dw定义字数据
            dw 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0    //定义空数据用作栈空间
    start:mov ax,cs      //CS;IP指向此处  start
          mov ss,ax
          mov sp,30h
          
          s:push cs:[bx]  
            add bx,2
            loop s
            
            mov bx,0
            mov cx,8
          s0:pop cs:[bx]
            add bx,2
            loop s0
            mov ax,4c00h
            int 21h
    code ends
    end start
    
22、数据在不同段
    assume cs:code ,ds:data,ss:stack
    data segment
    dw 0123H ,0456H ,0789H,0abcH,0defH,0fedH,0cbaH,0987H   //dw定义字数据
    data ends
    
    stack segment
    dw 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0    //定义空数据用作栈空间
    stack ends
    
    code segment
            
            
    start:mov ax,stack      //CS;IP指向此处  start
          mov ss,ax
          mov sp,20h
          mov ax,data
          mov ds,ax
          
          mov bx,0000
          mov cx,8
          s:push [bx]  
            add bx,2
            loop s
            
            mov bx,0
            mov cx,8
          s0:pop cs:[bx]
            add bx,2
            loop s0
            mov ax,4c00h
            int 21h
    code ends
    end start
    
23、处理字符问题,将字符转换为ASSII值
    解决大小写转换
    assume cs:codesg ,ds:datasg
    datasg segment
    db 'BaSiC'
    db 'iNfOrMaTiOn'
    datasg ends
    
    code segment    
    start:
          mov ax,datasg
          mov ds,ax
          
          mov bx,0
          mov cx,5
         s:mov al,[bx]
          and al,11011111b
          mov [bx],al
          inc bx
          loop s

        s0:mov al,[bx]
          or al,00100000b
          mov [bx],al
          inc bx
          loop s0
          mov ax,4c00h
          int 21h
    code ends
    end start
    
24、[bx + idata]的含义
    mov ax,[bx+200]  偏移地址为200加上bx中的数值
    mov ax,200[bx]
    mov ax,[bx].200
    
    assume cs:codesg ,ds:datasg
    datasg segment
    db 'BaSiC'
    db 'MinIX'
    datasg ends
    
    code segment    
    start:
          mov ax,datasg
          mov ds,ax
          
          mov bx,0
          mov cx,5
         s:mov al,[bx]
          and al,11011111b
          mov [bx],al
          mov al,[5+bx]
          or al,00100000b
          mov [5+bx],al
          inc bx
          loop s

        
         
          mov ax,4c00h
          int 21h
    code ends
    end start
    
25、变址寄存器 SI (source index) DI (destindex) 16位寄存器不可分高低位   bx常用作基地址
    mov bx ,0
    mov ax,[bx]
    mov si ,0
    mov ax,[si]
    mov di ,0
    mov ax,[di]
    
    
    assume cs:codesg ,ds:datasg
    datasg segment
    db 'welcome to masm!'
    db '................'
    datasg ends
    
    code segment    
    start:
          mov ax,datasg
          mov ds,ax
          
          mov si,0
          mov di,16
          mov cx,8
         s:mov ax,[si]
          mov [di],ax
          add si,2
          add di,2
          loop s
          mov ax,4c00h
          int 21h
    code ends
    end start
    
26、[bx+si] 和[bx+di]  基址变址寻址
    mov ax,[bx+si]  //bx+si  bx中的数值加上si中的数值
    
27、[bx+si+2] 和[bx+di+2]  相对基址变址寻址
    

 

 

 

 

 

 

28、转移指令

 

 

29、jmp跳转指令

 

 

 

 

 

 

 

 

 

 

 

 30、call 和ret指令

 

 

 

 

 

 

 

 

 

 

 

 

 31、标志寄存器

 

 

 

 

 

 

 

 

 

32、中断 处理

 

 

 

 

 

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值