data segment
str1 db 'hello world123456789$'
data ends
code segment
start:
mov ax,data
mov ds,ax
mov dx,offset str1
mov ah,09h
int 21h
mov ah,4ch
int 21h
code ends
end
上面的代码,实现HELLO WORLD ,相当于c语言打印printf("hello world123456789");
知识点:
(1)寄存器:CPU有14个16位寄存器,分别是:AX,BX,CX,DX, CS,DS,ES,SS,SI,DI,BP,SP,IP,FLAG.每个16位寄存器又分为高8位以及低8位,比如AX,高8位为AH,低8位为AL.
(2) 汇编分为4个段,分别是代码段、数据段、堆栈段、附加段。本程序只是用了代码段以及数据段。数据段主要用于存放数据,代码段主要编写指令。
(3)代码段:
data segment
str1 db 'hello world123456789$'
data ends
其中db是指字节,汇编中常用的定义包括db 、 dw 、DD,其中DB为1个字节,DW为字,即2个字节,DD为双字,即4个字节。'hello world123456789$' 表示一个字符串,在汇编中单引号以及双引号都可以用来定义字符串。$为字符串结束符,相当于C语言的'\0'
(4) 声明
assume cs:code,ds:data 声明代码段是哪些段,数据段是哪些段
(5)代码段.
start: 指令的入口地址,相当于C语言的main
mov ax,data
mov ds,ax
表示把代码段的段基址放入DS寄存器(注意在8086中寻址是采用段基址*16+偏移地址来寻址的,通过这样扩展,16位能够寻址1M内存)。
mov dx,offset str1
取数据段字符串的偏移地址,并传输到 DX中
mov ah,09h
int 21h
调用DOS中断打印字符,09表示打印字符,DOS会自动从DX读取字符进行打印,直到遇到$停止。
mov ah,4ch
int 21h
返回,相当于return ;