汇编版Hello world
2.1汇编版Hello world
汇编的程序结构主要包含代码段,数据段,堆栈段。下面举一个汇编版的hello world来了解汇编程序的结构构成(在汇编程序中,以“;”开始的语句是注释语句)。
;堆栈段
stack segment
db 100 dup(?)
stack ends
;数据段
data segment
szHello db 'hello,world',0dh,0ah,'$'
data ends
;代码段
code segment
;assume将cs,ds,ss段寄存器分别与code,data,stack段对应
assume cs:code,ds:data,ss:stack
;程序开始执行
start:
mov ax,data
mov ds,ax
mov ah,9
mov dx,offset szHello
int 21h
mov ah,1
int 21h
mov ah,4ch
int 21h
;代码段结束
code ends
;程序结束
end start
在上面的汇编程序中,首先定义了一个堆栈段。堆栈段长100字节,这里db就是字节的意思,如果是用dw就是字,100 dup(?) 中的dup是重复的意思,这句话是重复100遍,一遍定义一个字节,每个字节里全填0。
紧接着定义了一个数据段。定义了字符串szHello,其中”0dh”,”0ah”分别是回车键,换行键的ASCII码,'$'字符串的结束标志。
最后定义了一个代码段。指令”assume”确定cs,ds,ss,指向的逻辑段。汇编中,assume的作用是告诉汇编程序各个段寄存器应该与哪个逻辑段对应,该伪操作把程序中定义的各个段分配给段寄存器,使程序中使用的段名与段寄存器建立起对应关系。使得汇编程序清楚在计算地址时使用哪一个段地址但并不赋予该逻辑段的段地址。没有assume这行代码也可以,但其后的变量操作需要用段跨越前缀指明所在逻辑段。所以说assume语句是设定语句,是告诉汇编器在将源代码翻译成机器语言时,CPU的各个段寄存器如何与你定义的各个逻辑段相联系。比如ASSUME CS:CODE 这个例子CS段寄存器就选了CODE代码段。
start:
mov ax,data
mov ds,ax ;设置数据段的段地址ds
mov ah,9 ; ah中的9号功能表示要显示一行字符串
mov dx,offset szHello ;取得szHello的偏移地址,也就是在ds段中的偏移地址
int 21h
mov ah,4ch;退出 ah中的功能号4ch表示要返回DOS
int 21h ;调用DOS
code ends
end start