看完这篇文章就不要再问我汇编了

先来个小栗子再来解释:
看完下面的内容相信你已经知道汇编怎么注释了 。
;.asm文件命名不能超过8个英文字符,否则不能打开;我的学号为52013149520,学号的最后一位为0,编写程序测试6B7AH的第0位,如果为0,屏幕上显示0,否则屏幕显示1;我用的是根据学号数将DX=0001H左移几位,测试值和DX相与,再和DX比较,根据标志跳转,从而输出0或1;;也可以采用TEST等等data SEGMENT;数据段,编程者可以把数据都放到这个段里num dw 0,6B7AH;学号最后一位(0~9),测试数值啥都不加的时候,默认是10进制的data ENDS;数据段结束处 。;6B7AH=?0110101101111010?B 位数从右往左数 zhengqian SEGMENT;代码段,实际的程序都是放这个段里,此处zhengqian为代码段名 。ASSUME CS:zhengqian,DS:data ;告诉编译程序,data段是数据段DS,code段是代码段CSstart: MOV AX,data;前面的start表示一个标识位(可省略),后面用到该位,如果用不到,可不加MOV DS,AX;这一句与上一行共同组成把data赋值给DS段寄存器.MOV CL,DS:[0]MOV BX,DS:[2];此时bx内为6B7AhMOV DX,0001HSHL DX,CL;逻辑左移CL位 AND BX,DX;与操作,得bx,我的此时为0CMP BX,DX;再和dx比较,相等时结果为0,ZF=1 零标志,跳转,输出1 ,我的现在不相等不需跳转JZ eqlMOV DL,48;输出0JMP s;无条件跳转eql:MOV DL,49;输出1s: MOV AH,02H;2号功能INT 21H MOV AX,4C00H;程序退出,该句内存由下一行决定 。退出时,要求ah必须是4c 。INT 21H;记住规定这样zhengqian ENDS;代码段结束 。END start;整个程序结束,并且程序执行时由start那个位置开始执行 。;ptr-pointer(指针)缩写保留字mov ax,word ptr [bx]<===>MOVE AX,BX因为同类型所以不用word是把内存地址等于“BX寄存器的值”的地方所存放的数据,赋予ax;cmp WORD PTR[SI+BX],0 ;拿一个“字”,和零,相比较
其实我完全可以用test更快更好的解决,我为什么要这样写呢 。
(因为一开始学更好理解一些)
进入正题:
先学几个指令8
数据传送指令:
把数据从一一个位置传送到另一个位置
计算机中最基本的操作
程序设计中最常使用的指令
除标志寄存器传送指令外,均不影响状态标志
MOV XCHG PUSH POP LEA
MOV (Move): 最常用的数据传送指令
功能: 把源操作数送给目的操作数
语法: MOV 目的操作数,源操作数
格式:
MOV AX,2000H;将16位数据2000H传送到AX寄存器
MOV AL,20H;将8位数据20H传送到AL寄存器
MOV AX,BX;将BX寄存器的16位数据传送到AX寄存器
MOV AL,[2000H];将2000H单元的内容传送到AL寄存器
将一个数据从源地址传送到目标地址(寄存器间的数据传送本质上也是一样的)
1.两个存储单元之间不能直接传送数据
即:MOV指令只允许一个操作数在存储器中 。MOV [SI],[2000H];这是错误的
2.MOV指令中立即数不能直接传送给段寄存器(CS、DS、SS、ES)和IP;段寄存器之间不能直接传送 。MOV IP,2000 H ;这是错误的
3. CS和IP不能作为目的操作数 。MOV CS,AX ;这是错误的
4. MOV指令中立即数不能作目标操作数 。MOV 2000H,[SI] ;这是错误的
MOV指令可以在CPU内或CPU和存储器之间传送字或字节,它传送的信息可以从寄存器到寄存器,立即数到寄存器,立即数到存储单元,从存储单元到寄存器,从寄存器到存储单元,从寄存器或存储单元到除CS外的段寄存器(注意立即数不能直接送段寄存器),从段寄存器到寄存器或存储单元 。
MOV指令不会影响标志位
MOV指令中绝对不允许在两个段寄存器之间直接传送数据
MOV指令中绝对不允许在两个存储单元之间直接传送数据