微机原理入门学习讲解

说明

本人推崇面向结果,面向编程式学习,在学习的过程当中以学校发的实验代码为主,一步步讲解理解代码,进而构建一个属于微机汇编知识的理论框架。

1.寄存器基本知识介绍:

8086CPU各寄存器及其简介

汇编语言——第3章 寄存器(内存访问)

8086CPU各寄存器及其简介

汇编笔记

汇编语言基本指令

汇编指令学习与总结CMP,TEST,JE,JNZ,JNE,LEA,MOVE,SUB,INC,DEC,ADD,MUL,DIV,JGE,JB ,CQD

2.代码讲解:

DATAS SEGMENT
    info db 'zhuyingcong is a good student in a good country';定义以info为首地址的五个数据; DB指字符类型,就好像C语言的基本类型的功能一样,前面的info则是标识符。
DATAS ENDS

STACKS SEGMENT
    ;此处输入堆栈段代码
STACKS ENDS

CODES SEGMENT
    ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
    MOV AX,DATAS
    MOV DS,AX
    ;DS 数据段寄存器;
    ;data(数据) 转到 DS 数据段寄存器,让数据段指向正确的位置。
    ;DATA不是指令,而是伪指令,实际上是一个动态的内存地址,要想运行,必须先放入到DS中,但是内存数不能放入段地址。
    ;MOV AX,DATA起到过渡作用


    mov bx,offset info;offset 即元素偏移量,可以动态地得到元素的大小,位置等等
    ;意思是将info的首地址传送给基址寄存器BX,OFFSET +X符识符,表示取X的首地址,整个语句的寻址方式为立即数寻址,MOV在这语句中起传送地址的作用.此时BX=info(表示地址.)
    mov si,0;SI――源变址寄存器(Source Index),常保存存储单元地址

    loop1:;这个循环的意思是,从第一个字符开始判断,判断后三位字符结合起来是否为good,如果是的话就不发生跳转,进行下一步打印出good和之后的两个字符,如果根本构不成"good"字符串,则继续循环
        inc si;1指令:类似C语言中的自增+1

        cmp si,50
        ;CMP 目的操作数, 源操作数;CMP(比较)指令执行从目的操作数中减去源操作数的隐含减法操作,并且不修改任何操作数。若两个字符相同,则标志位zf置为1
        ;这里的意思是给定一个循环的界限,当循环到50次的时候,就退出循环(理论上50次也够找出所有good了)

        je flag
        ;如果当si=50,执行cmp语句得出结果等于0,则标志位ZF=1,je则根据ZF标志位判断,此时发生跳转,跳转位置为下面的flag,意思就是直接跳出这个循环了

        mov dl,[bx+si-1];设置 AX 的值为偏移地址为 BX 中的值时所代表的内存单元
        ;[bx+si-1]是代表内存单元,默认的寄存器的ds,所以实质的意思就是mov dl,ds[bx+si-1] 把bx+si-1号内存单元的内容放到8位寄存器dl 里面
        cmp dl,'g';比较当下字符和'g'是否相等,如果是则zf等于1
    jnz loop1;判断是否跳转,当zf标志为0时发生跳转,当zf为1时不跳转。

        inc si;自增,地址后移一位
        MOV dl,[bx+si-1];当第一个“g”出现时,判断后面的第一个字符是否为“o”
        cmp dl,'o'
    jnz loop1;JNZ,全称jump if not zero,汇编语言中的条件转移指令。结果不为零(或不相等)则转移。(不相等时跳转) ZF=0,如果有good的话,是相等的,所有不跳


        inc si
        MOV dl,[bx+si-1];判断后面的第一个字符是否为“o”
        cmp dl,'o'
    jnz loop1

        inc si
        MOV dl,[bx+si-1];判断后面的第一个字符是否为“d”
        cmp dl,'d'
    jnz loop1
    
   	   
    MOV ah,02h;AH = 02h是输出单个字符,MOV ah,02h与int 21h配套使用
    MOV dl,[bx+si-4];输出当前地址位置的前第三个字符,也就是g
    int 21h;输出当前字符,这里的意思就是输出当前的dl寄存器内的值

    MOV dl,[bx+si-3];输出当前地址位置的前第二个字符,o
    int 21h
    
    MOV dl,[bx+si-2];输出当前地址位置的前第一个字符,o
    int 21h
    MOV dl,[bx+si-1];输出当前地址位置对应的这个字符,d
    int 21h
    MOV dl,[bx+si];输出good后的第一个字符
    int 21h
    MOV dl,[bx+si+1];输出good后的第二个字符
    int 21h
    MOV dl,[bx+si+2];输出good后的第三个字符
    int 21h

    ;add si,20
    ;mov cx,si
    MOV cl,0AH
    MOV dl,cl;在汇编语言中有个2号系统功能调用,其作用是将DL中的ASCII码显示到屏幕,前提就是要往DL中传送ASCII码。这里的0AH是换行符的ASCII码
    int 21h

    jmp loop1 ;loop1跳回循环开始处,继续开始扫描检测是否有good


    flag:               
        MOV AH,4CH;  4CH编号表示结束DOS的功能,再返回本程序
        INT 21H;INT 21H是指令自动转入中断子程序的入口,选择哪个功能的指令取决于AH中的值
CODES ENDS
    END START

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值