1. 汇编语言结构
不带数据的结构
assume cs:codesg
codesg segment
mov ax, 0123H
mov bx, 0456H
add ax, bx
add ax, ax
mov ax, 4c00H
int 21H
codesg ends
end
其中:
1. xxx segment ...... xxx ends 是伪指令,定义了一个段。一个完整的汇编程序,至少得有一个段
2. end 是伪指令,告诉汇编编译器,程序到这里结束
3. mov ax,4c00H int 21H,程序返回
4. assume 假设
带数据的结构
assume cs:code
code segment
:
:
数据
:
start:代码
code ends
end start
分成多段的结构
assume cs:code, ds:data, ss:stack
data segment
dw 0123h,0456h
data ends
stack segment
dw 0,0,0,0
stack ends
code segment
start : mov ax, stack
mov ss, ax ;把栈的段地址放到ss中
code ends
end start
2. 常量(idata)在debug程序 和 源程序中的不同含义
mov ax,[idata]在debug程序中 和 在源代码中,有着不同的含义。
在debug中,idata表示偏移地址,即(ax)=((ds)*16 + idata);
在源程序中,idata表示常数,即(ax)=idata, 如果写成mov ax,ds:[idata],则idata就表示偏移地址了。
练习:请说出下列指令,在汇编语言中的含义
1. mov al,[0] (al)=0,将常量0送入al寄存器,与mov al,0含义相同
2. mov al, ds:[0] (al)=((ds)*16+0),0为偏移地址
3. mov al,[bx] bx存储器中是偏移地址,默认段寄存器是ds
4. mov al, ds:[bx] 同上
3. 内存定位方法(寻址方式)
4.再谈寻址方式
立即寻址:idata
寄存器寻址:ax
直接寻址:idata
寄存器间接寻址:[bx],[si],[di]
寄存器相对寻址:[bx+idata] [si+idata] [di+idata]
基址加变址寻址:[bx+si] [bx+di]
相对基址加变址寻址:[bx+si+idata] [bx+di+idata]
后五种数据存储器寻址