连接过程:伪指令不会被连接编译
连接过程
中断:
在代码段中存放数据:
;伪代码 关联CS寄存器为code
assume cs:code
;与code ends一一对应
code segment
;在代码段寄存器中存放字型数据
dw 1122h, 3344h, 5566h
;在代码段寄存器中存放10个重复值为0000h的字型数据
db 10 dup(0)
;标记程序执行入口,与end start是一一对应的
start:
mov al, 0h
;取CS段寄存器的数据1122h
mov bx, cs:[0]
code ends
end start
打印hello world:
assume cs:code ds:data
;数据段
data segment
;$表示字符串结束
db 'hello world$'
data ends
;代码段
code segment
start:
;手动设置关联ds的值,cs不需要手动设置是因为cs有start入口
mov ax,data
mov ds,ax
;打印字符串,需要把ds数据移动到dx中,ds字符串数据从0h开始
mov dx,0h
;执行中断指令 ,9h关联为中断表中的打印字符串程序指令
mov ah, 9h
int 21h
;退出程序
mov ax,4c00h
;执行中断指令
int 21h
code ends
end start
多段访问:
; 提醒开发者每个段的含义
assume cs:code, ds:data
; ----- 数据段 begin -----
data segment
age db 20h
no dw 30h
db 10 dup(6) ; 生成10个连续的6
string db 'Hello World!$'
data ends
; ----- 数据段 end -----
; ----- 代码段 begin -----
code segment
start:
; 手动设置ds的值
mov ax, data
mov ds, ax
mov ax, no
mov bl, age
; 打印
mov dx, offset string
; offset string代表string的偏移地址
mov ah, 9h
int 21h
; 退出
mov ax, 4c00h
int 21h
code ends
; ----- 代码段 end -----
; 编译结束,start是程序入口
; start所在的段就是代码段
; 所以cs的值就是code段的段地址
; 相当于cs的值已经自动设置完毕
end start
栈使用:
assume cs:code, ds:data, ss:stack
; 栈段
stack segment
db 10 dup(8)
stack ends
; 数据段
data segment
db 20 dup(9)
data ends
; 代码段
code segment
start:
; 手动设置ss和ds
mov ax, stack
mov ss, ax
mov ax, data
mov ds, ax
mov ax, 1122h
mov bx, 3344h
mov [0], ax
; 使用栈
mov sp, 10
push ax
push bx
pop ax
pop bx
; 退出
mov ax, 4c00h
int 21h
code ends
end start
网友评论