汇编
关于程序的介绍部分。
程序
过程
- 编写汇编程序
- 用汇编语言编译程序对源程序进行编译
- 产生目标文件
- 再用链接程序对目标文件进行链接
- 产生可执行文件
- 执行可执行文件
可执行文件
- 程序
- 源程序中的汇编指令翻译过来的机器码
- 源程序中定义的数据
- 相关的描述信息
源程序
伪指令
- 汇编语言源程序中,包含两种指令
- 汇编指令:对应的机器码的指令,可以被编译为机器指令,最终被CPU执行
- 伪指令:没有对应的机器指令,最终不被CPU执行
1 2 3 4 5 6 7 |
assume cs:codesg codesg segment //xxx codesg ends end |
segment ...ends
是一对成对使用的伪指令- 功能是定义一个段
- 上述assume是一个段名
- 一个汇编程序是由多个段组成的,这些段被用来存放代码、数据或当前栈空间来使用
- 一个有意义的汇编程序至少要有一个段,这个段用来存放代码
- ends是一个段的结束标记,而end是一个汇编程序的结束标记
- assume的含义是“假设”
- 它假设某一段寄存器和程序中的某一个用
segment ... ends
定义的段相关联
- 它假设某一段寄存器和程序中的某一个用
源程序中的程序
- 源程序中的程序指的是最终由计算机执行、处理的指令或数据
标号
- 上述的codesg就是标号
- 一个标号指代了一个地址
- codesg作为一个段的名称,最终会被编译、链接程序处理为一个段的地址
程序的结构
- 源程序是由一些段构成的
- 首先,定义一个段
1 2 3 |
aet segment aet ends |
- 在段中写入汇编指令
1 2 3 4 |
aet segment mov ax,2 add ax,ax aet ends |
- 有必要指出程序在何处结束
1 2 3 4 5 6 |
aet segment mov ax,2 add ax,ax aet ends end |
- aet是被当作段来使用,如果有需要,可以将aet与cs段寄存器关联起来
1 2 3 4 5 6 7 8 |
assume cs:aet aet segment mov ax,2 add ax,ax aet ends end |
程序返回
- 在程序末尾加上下述两句汇编指令,就可以实现程序返回
- 它由CPU执行
1 2 |
mov ax,4c00H int 21H |
[BX]和LOOP
[bx]
- [bx]和[0]类似,[0]标识内存单元,偏移地址是0,段地址默认在ds中
- [bx]同样表示一个内存单元,段地址在ds中,偏移地址在bx中
loop
- 格式:
loop 标号
- CPU执行loop指令的时候,要进行两步操作
(cx) =(cx)-1
- 判断cx中的值,不为0则转至标号处执行程序
- 通常,用loop指令来实现循环功能
- cx中存放着循环次数
段前缀
mov ax,ds:[bx]
- 将一个内存单元的内容送入ax,这个内存单元的长度为2个字节,存放一个字,偏移地址在bx中,短地址在ds中
mov ax,cs:[bx]
mov ax,ss:[bx]
mov ax,es:[bx]
mov ax,ss:[0]
mov ax,cs:[0]
代码段中使用数据
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
assume cd:code dw 0123h,0456h,0789h,0abch,0defh,0fegh,0cdah,0985h mov bx,0 mov ax,0 mov cx,8 s:add ax,cs:[bx] add bx,2 loop s code ends end |
- dw的含义是定义字型数据(define word)
- 这里dw定义了8个字型数据,它们占用了16个字节的空间
- 程序的指令对这8个数据进行累加,由于它们在代码段中,程序在运行的时候cs中存放了代码段的段地址,所以可以从cs中得到它们的段地址
- 因为用dw定义的数据处于代码段的最开始,所以偏移地址为0
- 这8个数据的偏移地址为:0,2,4,6,8,A,C,E
代码段中使用栈
- 可以用dw定义多个字型数据,在程序加载后,将取得多个字的内存空间
- 而这段空间,可以当作栈来使用
不同的段
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 |
assume cs:code,ds:data,ss:stack data segment dw 0123h,0456h,0789h,0abch,0defh,0fegh,0cdah,0985h data ends stack segment dw 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 stack ends code segment start:mov ax,stack mov ss,ax mov sp,20h ;设置栈顶ss:sp指向stack:20 mov ax,data mov ds,ax ;ds指向data段 mov bx,0 ;ds:bx指向data段中的第一个单元 mov cx,8 s: push [bx] add bx,2 loop s ;以上将data段中的0-15单元中的8个字型数据依次入栈 mov bx,0 mov cx,8 s0: pop [bx] add bx,2 loop s0 ;以上将依次出栈8个字型数据到data段中的0-15单元中 mov ax,4c00h int 21h code ends end start |
本文为原创文章,版权归Aet所有,欢迎分享本文,转载请保留出处!
你可能也喜欢
- ♥ X86_64汇编学习记述三08/08
- ♥ 基础知识03/22
- ♥ X86_64汇编学习记述四08/09
- ♥ 相关指令05/06
- ♥ 汇编记述一08/04
- ♥ 寄存器和内存访问03/28