kingfon 发表于 2017-11-30 10:41:51

实验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
用栈的方式感觉麻烦一点,呵呵……
有看过论坛上其他朋友的方法
刚开始学,如有错误望各位多多指正

有关部门临时工 发表于 2018-7-11 16:22:08

有个问题我不太明白想请教一下,就是我们将C段选做栈空间,将c的是传递给SS,由于SS指向的地址是栈底,我们又将sp指向偏移地址为8的位置,sp指向的位置是栈顶,所以此时我们不就等于将b段给划入栈空间的么,我理解栈是从下往上划的,所以我理解中应该是将cs的地址传递给ss这样从逻辑上来看ss正好是处于c段的最底部,这样ss作为栈底往上划栈空间为8的话正好把整个c段划分到栈空间里。我的理解如果有误的话麻烦您指出一下。
页: [1]
查看完整版本: 实验5第5小题用栈实现