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


*把源串段地址给DS 。
*把源串编址给SI 。
*把目的串段址给ES 。
*把目的串偏址给DI 。
*把要复制的个数给CX,这里可不考虑$了 。
*把FLAG中的方向标志标志你要的方向,一个是顺向,另一个是逆向 。
*发送loop movs,scans等命令 。
6 转移指令
记住:无条件转移指令 jmp 。等于转 jz,不等于时转jnz
7 中断指令
int 中断号,注意进制,默认是十进制,所以十六进制就加h
汇编程序框架
data'数据段,编程者可以把数据都放到这个段里
…数据部分 '数据格式是: 标识符 db/dw 数据 。
data ENDS '数据段结束处 。
edata'附加数据段,编程者可以把数据都放到这个段里
…附加数据部分
edata ENDS '附加数据段结束处 。
code'代码段,实际的程序都是放这个段里 。
CS:code,DS:data,ES:edata '告诉编译程序,data段是数据DS,code段是代码段CS
start:MOV AX,data '前面的start表示一个标识位,后面用到该位,如果用不到,可不加
MOV DS,AX '这一句与上一行共同组成把data赋值给DS段寄存器.
MOV AX,edata
MOV ES,AX '与前一句共同组成edata->ES
…….程序部分
MOV AX,4C00h '程序退出,该句内存由下一行决定 。退出时,要求ah必须是4c 。
INT 21h
code ENDS '代码段结束 。
END start '整个程序结束,并且程序执行时由start那个位置开始执行 。
在这个结构中,有三个段,DS,ES,CS 。这三个段分别存数据,附加数据,代码段 。
编写我们的Hello,world思路 。
开始编写我们的第一个程序 。
程序要求:显示一个“Hello,.”怎么样?
思路:
1 要显示一个字符串,根据前面我让你们记的七八个指令够吗?答案是:不仅够,而且还用不完 。
首先定义一下总可以吧 。
hellostr db 'Hello, ZHENGQIAN.$'
最后的$不要忘了 。
2 首先要考虑的问题就是找中断,找到合适的中断,该中断就能帮我们完成这个显示任务 。我找到(在哪找到的,怎么找到的,别问我,到网上或书上都能找到):
中断INT 21H功能09H
功能描述: 输出一个字符串到标准输出设备上 。如果输出操作被重定向,那么,将无法判断磁盘已满
入口参数: AH=09H
DS:DX=待输出字符的地址
说明:待显示的字符串以’$’作为其结束标志
出口参数: 无
由上面看到,我们所需要作的就是把DS指向数据段,DX指向字符串的地址,AH等于9H,调用21h中断 。
mov ds,数据段地址
lea dx, '已在前面1中定义了 。
mov ah,9h
int 21h
只要在调用int 21h前把准备的东西准备齐就行,所以int 21h前面三行的顺序并不重要 。
【看完这篇文章就不要再问我汇编了】3 退出程序,运行完总要退出呀 。再查中断手册
中断INT 21H功能4CH
功能描述: 终止程序的执行,并可返回一个代码
入口参数: AH=4CH
AL=返回的代码
出口参数: 无
mov ah,4Ch
mov al,0
int 21h

mov ax,4c00h
int 21h
需要说明的是返回代码有什么用,返回给谁?返回给操作系统,因为是操作系统DOS调用的这个程序,这个返回值可以通过批处理中的得到,这里不多说明,实际上操作系统很少处理这一值,因此al你随便写什么值影响都不大 。
程序实现
data
msg DB ‘Hello, .$’
data ENDS
code
CS:code,DS:data
start:MOV AX,data
MOV DS,AX