汇编程序的编写

一个完整的汇编程序一点一点的来介绍会感觉比较麻烦,我们直接从一个完整的Hello world程序来看

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
assume cs:code,ds:data

data segment ;数据段
string db 'Hello,World!$'
data ends

code segment ;代码段
start:
mov ax,data ;获取段基址
mov ds,ax ;将段基址送入寄存器
mov dx,offset string
mov ah,9
int 21h
mov ah,4ch
int 21h
code ends
end start

这里我们主要理解该程序的结构,明白如何书写,如何从文件到运行。

  1. 程序开头我们使用了assume,将我们的寄存器和代码关联起来,一个程序要分为数据段,代码段时我们就可以使用assume,assume
    cs:code,ds:data表示将code代码段与cs寄存器关联起来,data段与ds寄存器关联起来,(本质是将段的起始地址放入对应寄存器中)
  2. 中间可以出现多个segment,表示一个段的标识,这里只有数据段和代码段两个,希望将数据和代码区分时,可以将数据单独拿出来做一个数据段。每一个ends表示一个段的结束,(与end区别)
  3. data,code是标号,表示一个地址,可以理解为一个段的名字。
  4. Start:表示代码段的起始,本质是将当前地址赋给cs,因为cs:ip指向需要执行的语句。不申明的话指向程序起始地址(hello
    world),但是该语句是数据,不能执行,因此需要使用start申明。代码段结束使用end start

在这里插入图片描述

如何从代码到执行

汇编的源码放在一个.asm文件中,第一步编译为obj文件,然后在将obj文件连接起来得到exe文件,最后由操作系统运行exe

文本文件(.asm)—-> .obj文件 —> .exe —> 结果

在这里插入图片描述
在DOSBox中:

1
2
3
masm 1.asm 
link 1.obj
1.exe

在这里插入图片描述