汇编教程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!