在程序的段中存放数据
- 在程序的段中【数据段、代码段、栈段】存放数据,运行时由操作系统分配空间。如果在程序中直接书写数据,是会有危险的
- 将内存
ffff:0 ~ ffff:b
中的数据拷贝到 20:0~20:b
单元中; 使用附加段寄存器
assume cs:code
code segment
mov ax,0ffffh ;累加器
mov ds,ax ;数据段寄存器
mov ax,0020h ;累加器
mov es,ax ;附加数据段寄存器
mov bx,0 ;基址寄存器
mov cx,12 ;计数寄存器
s: mov dl,[bx] ;dx数据寄存器
mov es:[bx],dl
inc bx
loop s
mov ax,4c00h
int 21h
code ends
end
程序的一般框架
- dw: define word 定义字型数据
dw 定义一个字
db 定义一个字节
dd 定义一个双字 - start 定义一个标号,指示代码开始的位置
end 除了通知编译器程序结束外,还可以通知编译器程序的入口在什么地方
程序加载后,CS:IP指向要执行的第一条指令在start处
如果不指定start和end,直接在代码段中定义数据,CS:IP会指向数据段寄存器的开始assume cs:code
code segment
dw 0123H,0456H,0789H,0abcH,0defH
start mov bx,0
mov ax,0
mov cx,8
s: add ax,cs:[bx]
add bx,2
loop s
mov ax,4c00h
int 21h
code ends
end start
在代码段中使用栈
assume cs:codesg ;cs是段地址
codesg segment
dw 0123H,0456H,0789H,0abcH,0defH,0cbaH,0987H
dw 0,0,0,0,0,0,0,0,0,0,0,0,0,0
start: mov ax,cs
mov ss,ax ;定义了栈的段地址
mov sp,30h ;定义了栈的偏移地址
mov bx,0
mov cx,8
s: push cs:[bx]
add bx,2
loop s
mov bx,0
mov cx,8
s0: pop cs:[bx] ;出栈到原来的位置,以达到逆序的目的
add bx,2
loop s0
mov ax,4c00h
int 21h
codesg ends
end start
将数据、代码、栈放入不同段
assume cs:code,ds:data,ss:stack
data segment
dw 0123H,0456H,0789H,0abcH,0defH,0cbaH,0987H
data ends
stack segment
dw 0,0,0,0,0,0,0,0,0,0,0,0,0,0
stack ends
code segment
; 初始化段寄存器的值
start:mov ax,stack ; 初始化栈寄存器
mov ss,ax
mov sp,20h
mov ax,data ; 初始化数据寄存器
mov ds,ax
; 初始化通用寄存器的值
mov bx,0 ; 基址寄存器
mov cx,8 ; 计数寄存器
s: push [bx]
add bx, 2
loop s
mov bx,0
mov cx,8
s0: pop [bx]
add bx,2
loop s0
mov ax,4c00h
int 21h
code ends
end start
处理字符问题
- 小写字母的ASCII码值比大写字母的ASCII码值大20H
- 第一个字符串将小写字母转化成大写字母
第二个字符串将大写字母转化成小写字母assume cs:codesg,ds:datasg
datasg segment
db 'BaSiC'
db 'iNfOrMaTiOn'
datasg ends
codesg segment
start:
mov ax,datasg
mov ds,ax
mov bx,0
mov cx,5
s: mov al, [bx]
and al,11011111b
mov [bx],al
inc bx
loop s
mov bx,5
mov cx,11
s0: mov al,[bx]
or al,00100000b
mov [bx],al
inc bx
loop s0
mov ax,4c00h
int 21h
codesg ends
end start