汇编简单入门教程(五)包含多个段的程序


 

参考: 《汇编语言》 王爽 第6章


1.在代码中使用数据


 

assume cs:code

code segment

	dw 0123h,0456h,0789h,0defh
	
	mov ax,0
	mov bx,0

	mov ax,4c00H
	int 21h

code ends

end

 

 

 

dw 表示定义字型数据,db 表示定义字节型数据。

 

上面代码编译连接,用debug调试,-u cs:0 查看汇编代码,发现没有看到 mov ax,0  mov bx,0 等。直接运行不正常。因计算机不知道那些是数据那些是代码。如果-u cs:8 就可以看到mov ax,0  mov bx,0 等。

正确方法,要加上程序入口

 

 

assume cs:code

code segment

	dw 0123h,0456h,0789h,0defh
	
start:	mov ax,0
	mov bx,0

	mov ax,4c00H
	int 21h

code ends

end start


start可以改成其他的名字,只要入口处和end 后面的一样就行了。

 

 

2.在代码中使用栈

 

例子:交换0123H 跟 0456H

dw 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 申请了栈的空间

sp 30H 设置 栈顶的起始位置

 

 

assume cs:code

code segment
	dw 0123h,0456h,0789h,0abch,0defh,0fedh,0cbah,0987h
	dw 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
	
start:	mov ax,cs
	mov ss,ax
	mov sp,30h
		
	push cs:[0]
	push cs:[2]
		
	pop cs:[0]
	pop cs:[2]
		
	mov ax,4c00h
	int 21h
		
code ends

end start

 

 

3.将数据、代码、栈放入不同的段中

 

例子:将数据段中的数据,倒叙存放

 

assume cs:code,ds:data,ss:stack

data segment
	dw 0123h,0456h,0789h,0abch,0defh,0fedh,0cbah,0987h
data ends

stack segment
	dw 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
stack ends

code segment	

start:	mov ax,data
		mov ds,ax
		mov ax,stack
		mov ss,ax
		mov sp,20h
		
		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

 

 

这里定义了三个段,数据段,栈段,代码段。ds,ss的值需要在代码段中指定。