在代码段中使用数据
代码结构
assume cs:code
code segment
··
··
数据
··
··
start:
··
··
代码
··
··
code ends
end start
在代码段中使用栈
代码结构跟上面的差不多,就是要在start中初始化段指针(SS\SP)
将数据、代码、栈放入不同的段
代码结构
assume cs:code, ds:data, ss:stack
data segment
··
data ends
stack segment
··
stack ends
code segment
start:
··
··
代码
··
··
code ends
end start
结构是这个结构,但是在代码段中,仍然需要使用初始化指令来将相应的ds\ss\sp寄存器初始化才可以。总而言之,cpu到底如何处理我们定义的段的中的内容,是当作指令执行,还是当作数据访问,还是当作栈空间,完全是靠程序中具体的汇编指令,和汇编指令对cs:ip、ss:sp、ds等寄存器的设置来决定的。
实验
前面几个都是给出程序来调试观察的。就不列举出来了
5
编写code总的代码段,将a段和b段中的数据依次相加,将结果保存在c段中。
assume cs:code
a segment
db 1,2,3,4,5,6,7,8
a ends
b segment
db 1,2,3,4,5,6,7,8
b ends
c segment
db 0,0,0,0,0,0,0,0
c ends
;把a 、b段中的数据相加,结果存储到c段当中
code segment
start: mov ax,a
mov ds,ax
mov ax,b
mov es,ax
mov ax,c
mov ss,ax
mov sp,8
mov bx,0
mov cx,7 ;方法1
; 这样的话解决不了最后08+08的情况, 栈顶指针刚好是0001-> FFFF 这样10放高地址就恰好被溢出了。
; 所以我觉得,还有一种方式是最后一个元素,用al,其他的用ah, 按照栈元素来说,这样做的是对的
; 代做: 这样做很麻烦倒是,更好的方式应该是分别计算两个字节的,然后组成一个字,同时push进去,这样的话就不用处理最后一个栈顶元素的问题了
; 方法1-------是个错误的方法,解决不了栈顶最初始的元素
s: mov ah,ds:[bx]
add ah,es:[bx]
push ax
add sp,1
; mov c:[bx],al
inc bx
loop s
;处理最后一个元素
mov al,ds:[bx]
add al,es:[bx]
push ax
;方法二------推荐--正确
; mov cx,4 ;方法2
; s: mov ah,ds:[bx]
; add ah,es:[bx]
; add bx,1
; mov al,ds:[bx]
; add al,es:[bx]
; add bx,1
; push ax
; loop s
mov ax,4c00h
int 21h
code ends
end start
6
编写code中的代码,用push指令将a段中的前八个字型数据,逆序存储到b段中。
assume cs:code
a segment
dw 1,2,3,4,5,6,7,8,9,0ah,0bh,0ch,0dh,0eh,0fh,0ffh
a ends
b segment
dw 0,0,0,0,0,0,0,0
b ends
code segment
start: mov ax,b
mov ss,ax
mov sp,10h;8个字型数据,栈顶指针的大小应该是10h哦!
mov ax,a
mov es,ax
mov bx,0
mov cx,8
s: push es:[bx]
add bx,2;bx这里要自增2哦!
loop s
mov ax,4c00h
int 21h
code ends
end start