目录
使用数据
使用栈
代码
总结
使用数据
首先,我们来看一个问题,就是编程计算0123H,0456H,0789H,0abcH,0defH,0fedH,0cbaH,0987H的和,结果存在ax寄存器中。看起来还是比较简单的,用简单的加法指令可以完成,但是这样会有一个问题,就是我们的程序和代码就是混在一起的,不仅导致程序混乱,也让人难以理解。
我们在使用C语言的时候,知道可以定义一个数组来解决这样的问题,但是在汇编中也没有数组啊,这可怎么办,别急,我们自有办法,那就是代码段。
我们把数据独立出来,这样的程序就简单明了了,而且也没有安全风险,看起来似乎不错,但是。我们来看看编译后这段代码是什么样的吧! 值得一体的是:dw定义一个字,db定义一个字节,dd定义一个双字。
assume cs:code
code segment
dw 0123H,0456H,0789H,0abcH,0defH,0fedH,0cbaH,0987H
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:code
code segment
dw 0123H,0456H,0789H,0abcH,0defH,0fedH,0cbaH,0987H
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
使用栈
使用栈的话,我们首先有一种想法,就是定义一段空的空间出来把它当成栈不久好了,这样虽然可行,但是程序这样显得混乱,编程和阅读时都要注意何处是数据,何处是栈,何处是代码。根据我们定义数据段的方法,大家也应该猜到了,我们可以再定义一个栈段来存放栈,说干就干,我们看代码。
代码
代码,栈,数据,各司其职,每个人都有自己的位置,到目前为止,一段完整的代码已经被我们敲出来了。
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,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
总结
已经可以敲出一段相对完整的代码了,再接再厉!