鱼C论坛

 找回密码
 立即注册
查看: 2986|回复: 1

[汇编作业] 实验5第5小题用栈实现

[复制链接]
发表于 2017-11-30 10:41:51 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
;这题的代码在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:[bx]
        add ah,es:[bx]                        ;计算高位的和存入AH
        sub bx,1                                ;偏移地址减1
        mov al,ds:[bx]
        add al,es:[bx]                        ;计算低位的和存入AL
        sub bx,1                                ;偏移地址减1
        push ax                                ;将结果入栈,也就是放在c段
        mov ax,0                                ;将ax置0
      loop s
      mov ax,4c00h
      int 21h
         
code ends
end start
用栈的方式感觉麻烦一点,呵呵……
有看过论坛上其他朋友的方法
刚开始学,如有错误望各位多多指正
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-7-11 16:22:08 | 显示全部楼层
有个问题我不太明白想请教一下,就是我们将C段选做栈空间,将c的是传递给SS,由于SS指向的地址是栈底,我们又将sp指向偏移地址为8的位置,sp指向的位置是栈顶,所以此时我们不就等于将b段给划入栈空间的么,我理解栈是从下往上划的,所以我理解中应该是将cs的地址传递给ss这样从逻辑上来看ss正好是处于c段的最底部,这样ss作为栈底往上划栈空间为8的话正好把整个c段划分到栈空间里。我的理解如果有误的话麻烦您指出一下。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-24 13:42

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表