实验5第5小题用栈实现
;这题的代码在xp系统的debug下测试过程中出错,但在win7 64位下用debug32(需到论坛下载)测试通过;用栈来实现就得在一次循环里计算2个字节,高位存入AH,低位存入AL,再把AX的值入栈
;计算开始时,用来存放偏移地址的BX值为7(从后往前计算,即8+8,7+7……2+2,1+1,因为push是从大的内存单元往小的内存单元存放),依次递减
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
code segment
start:mov ax,a
mov ds,ax ;a段做为数据段
mov ax,b
mov es,ax ;b段用es寄存器做段寄存器
mov ax,c
mov ss,ax ;c段做为栈空间使用
mov sp,8 ;栈顶偏移地址为8,因为我们将会往栈放入4个字型数据,即8个字节,依次放入偏移地址0-7号单元
mov bx,7
mov cx,4 ;一次循环处理2个字节,所以循环4次
s:mov ah,ds:
add ah,es: ;计算高位的和存入AH
sub bx,1 ;偏移地址减1
mov al,ds:
add al,es: ;计算低位的和存入AL
sub bx,1 ;偏移地址减1
push ax ;将结果入栈,也就是放在c段
mov ax,0 ;将ax置0
loop s
mov ax,4c00h
int 21h
code ends
end start
用栈的方式感觉麻烦一点,呵呵……
有看过论坛上其他朋友的方法
刚开始学,如有错误望各位多多指正 有个问题我不太明白想请教一下,就是我们将C段选做栈空间,将c的是传递给SS,由于SS指向的地址是栈底,我们又将sp指向偏移地址为8的位置,sp指向的位置是栈顶,所以此时我们不就等于将b段给划入栈空间的么,我理解栈是从下往上划的,所以我理解中应该是将cs的地址传递给ss这样从逻辑上来看ss正好是处于c段的最底部,这样ss作为栈底往上划栈空间为8的话正好把整个c段划分到栈空间里。我的理解如果有误的话麻烦您指出一下。
页:
[1]