汇编教程2 by sssa2000

汇编教程2 by sssa2000

  和女朋友有矛盾了,还是电脑好,可以让我静心。

  让我们开始把。上次用一个例子给大家一个模糊的概念,可能你并不是完全明白那个例子的来龙去脉,这没有关系,有个认识就可以了,

我觉得学习汇编最大的障碍是 书上的教法不适合初学者,即使是有基础的人学起来也有点迷糊,既然是编成当然要从实际入手,这次开始我们来一个例子热身,和上次那个差不多

=========================================================================

;目的:将键盘输入的多字符(注意是多字符)保存到由若干个存储单元组成的变量inbuf中,以回车结束。

code segment

     assume cs:code         ;由于没有声明变量,不需要设置数据段

start: mov bx,00h

again: mov ah,01h           ;调用中断,作用不用说了吧,键入一个字符将ascii到al(注意是一个字符)

       int 21h

       cmp al,0dh           ;如果al中的值是0dh,

       jz stop              ;则转到stop标号处执行

       mov [inbuf+bx],al    ;把al的数据装入到地址是inbuf+bx的地址

       inc bx               ;bx=bx+1

       jmp again            ;跳到again标号处执行,以接受下一个字符,直到用户回车

stop:  mov ah,4ch

       int 21h

code   ends

       end start

===============================================================================

 

程序不长,初学者最怕很长一段的程序,我那时也怕,现在也怕,人懒呀。

就这段程序,讲一讲mov,和分支程序。

 

注意了,背景音乐好了么,建议用神秘园,为什么?因为我在听。

 

mov指令

格式:mov 目的操作数,原操作数

说明:1、立即数,段寄存器cs,不能作为目的操作数;

    2、原操作数和目的操作数不能同为存储器操作数。下面指令是错误的

       mov 4h,bl

              mov cs,ax

              mov [1000h],[bx] ;[]表示取地址

   3、原操作数和目的操作数的类型必须一致,即同为单字节数,或同为双字节数,当指令中有一个操作数的类型明确时,另一个操作数被视为同一类型。可以用byte ptr 或word ptr将一个存储器操作数定义为字节或字类型。当存储器操作数为字类型时,寄存器或立即数的高字节对应其高地址,低字节对应低地址。

          解释一下,byte ptr是将一个操作数强制定义为byte类型,word ptr类似,类似c语言的()

                    最后一句话什么意思呢?我们知道,一个字=两个字节,在计算机中,对于字的存储是以字节为单位的,大家都知道堆栈遵循先进后出的原则,所以,要高低位对换,举个例子:一个字类型,值为:1234h,在内存中的位置:

|  34h  |  34为变量的低位。

|-------|

|  12h  |  12为变量的高位。

|------ |

|       |

好,我们来看这句话,当存储器操作数为字类型时,寄存器或立即数的高字节对应其高地址,低字节对应低地址。举个例子,

mov [2000h],ax

用图表示:    

|  存储器  | 

|----------|    

|存ax的低位al 

|----------|

|存ax的高位ah           

|----------|

 

 

分支程序

就是if...then ,goto等等这些,当然在汇编里面,没有这些语句

 

先看看cmp指令,

格式:cmp 目的数,原操作数

作用:根据两操作数的大小关系产生状态标志值,

 

jc/jnc指令

格式:jc/jnc 标号

作用:jc有进位则转,即cf=1  jnc相反 (什么是cf? 以后我会专门讲解电脑的寄存器,别急)

 

jp/jnp

jp:1的个数为偶数则转(pf=1),jnp相反

 

jz/jnz

jz:为零则转,(zf=1) jnz:相反

 

jl/jge

jl:小于则转(sf<>of或者zf=0) jge 大于等于则转(sf<=of或者zf=1)

。。。。。。。。还有很多哦,不写了,自己查资料,不要太懒了哦。

 

还有一个最重要的,jmp无条件跳转指令,不用解释了吧?

上面那个例子再看看,体会一下怎么跳转的。会有收获的哦~~

 

不过瘾?再来一段程序,

=========================================================================

求x-y的绝对值

dseg segment

     x db 40h

     y db 73h

     z db ?

dseg ends

sseg segment stack  ;设置堆栈段

     db 80h dup(0)

sseg ends

cseg segment

     assume ds:dseg,ss:sseg,cs:cseg  ;是不是觉得和以前的不一样了?呵呵,体会一下

start:

     mov ax,dseg

     mov al,x

     cmp al,y   ;根据x-y产生状态标志

     jl xl      ;有符号数则跳转

     sub al,y   ;

     mov z,al    ;z=x-y

xl:  mov bl,y

     sub bl,al

     mov z,bl     ;z=y-x

ok:

     mov ah,4ch

     int 21h

cseg ends

     end start

=============================================================================

 

 

好了,应该没什么问题了吧? 本来还想讲一些寻址方式的,下一章需要专门讲一下基础知识,避免不了的,不过到了现在,你对汇编的认识应该有点深度了,汇编其实并不难的,是么?如果你有这个感觉了,那我的目的也达到了,下一讲我们讲解寄存器,和寻址方式。不讲不行的。好了,class over!

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值