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