写一个简单的hello world程序

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
MyStack segment stack      ;stack表明是堆栈段,则之后系统给地址会从大到小,而且系统会自动把该段的基址送入ss寄存器
db 256 dup(?)
MyStack ends

MyData segment ;数据段
db 03,04,05,06
string db "Hello World$"
MyData ends

MyCode segment ;代码段
start: ;告诉编译器代码从此处开始
mov ax,MyData ;获取段基址
mov ds,ax ;将段基址送入寄存器
mov es,ax

mov dx,offset string ;==>mov dx,word ptr[0]==>mov dx,0 ;获取hello world在代码段的偏移
mov ah,09h ;系统调用printf函数
int 21h

mov ax,4c00h
int 21h ;退出程序
MyCode ends

end start

直接运行的结果

image-20240727171301486

单步调试

077C即为Data段的段基址

image-20240727171525813

接下来将段基址传到寄存器,第四步的4即为hello world在data段的偏移

image-20240727171641936

调用printf函数,打印hello world

image-20240727171744376

成功退出程序

image-20240727171842229

若添加这一行再调试

1
mov ax,MyStack

发现SS中的值即为MyStack的段基址,说明系统在知道MyStack为堆栈段后会自动将MyStack的段基址送入ss寄存器

image-20240727173553251