. : : Assembly Language : : .  |  首页  |  我提出的问题  |  我参与的问题  |  我的收藏  |  消息中心   |  游客  登录  | 
刷新 | 提问 | 未解决 | 已解决 | 精华区 | 搜索 |
  《汇编语言》论坛 ->CALL和RET指令
  管理员: assembly   [回复本贴] [收藏本贴] [管理本贴] [关闭窗口]
主题 : :  实验10除法子程序中sp过小的问题  [待解决] 回复[ 1次 ]   点击[ 366次 ]  
ptr
[帖 主]   [ 发表时间:2009-06-05 17:17 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:4
注册日期:2009-06-01 21:42
这个问题还要多谢zhenglxd指点出来,我把代码贴出来,显示堆栈区长度设置成12个字节,运行没问题,可单步调试出错,然后该成20个字节,一切正常,很想知道为什么!?

DATAS SEGMENT
    ;此处输入数据段代码  
    DB 2 DUP(0);保存DX值
DATAS ENDS

STACKS SEGMENT
    ;此处输入堆栈段代码
    DB 12 DUP(0)
STACKS ENDS

CODES SEGMENT
    ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
        ;初始化数据段指针
    MOV AX,DATAS
    MOV DS,AX
    MOV SI,0
    ;初始化堆栈段指针
    MOV AX,STACKS
    MOV SS,AX
    MOV SP,12
    MOV BP,12
    ;F4240H/0AH
    MOV AX,4240H
    MOV DX,000FH
    MOV CX,0AH
    
    CALL DIVDW
    MOV AH,4CH
    INT 21H
DIVDW:
        PUSH AX
        PUSH DS
        PUSH SI
        PUSH DX
        PUSH CX

        MOV AX,DX
        MOV DX,0
        DIV CX
        ;上面计算H/N,商在AX中,余数在DX中
        MOV [SI],AX;保存商
        ;下面算[rem(H/N)*65536+L]/N,其中rem(H/N)存在DX中
        MOV AX,[BP-4];取出L,即低16位,
        DIV WORD PTR [BP-12];进行32位除法,商在AX,余数在DX
        MOV CX,DX        ;把余数转移到CX,商放到CX(他也是整个表达式的值得低16位)
        MOV DX,[SI];把高16位放到DX
        
        POP CX
        POP DX
        POP SI
        POP DS
        POP AX
        RET
CODES ENDS
    END START


=====================================================================
DATAS SEGMENT
    ;此处输入数据段代码  
    DB 2 DUP(0);保存DX值
DATAS ENDS

STACKS SEGMENT
    ;此处输入堆栈段代码
    DB 20 DUP(0)
STACKS ENDS

CODES SEGMENT
    ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
        ;初始化数据段指针
    MOV AX,DATAS
    MOV DS,AX
    MOV SI,0
    ;初始化堆栈段指针
    MOV AX,STACKS
    MOV SS,AX
    MOV SP,20
    MOV BP,20
    ;F4240H/0AH
    MOV AX,4240H
    MOV DX,000FH
    MOV CX,0AH
    
    CALL DIVDW
    MOV AH,4CH
    INT 21H
DIVDW:
        PUSH AX
        PUSH DS
        PUSH SI
        PUSH DX
        PUSH CX

        MOV AX,DX
        MOV DX,0
        DIV CX
        ;上面计算H/N,商在AX中,余数在DX中
        MOV [SI],AX;保存商
        ;下面算[rem(H/N)*65536+L]/N,其中rem(H/N)存在DX中
        MOV AX,[BP-4];取出L,即低16位,
        DIV WORD PTR [BP-12];进行32位除法,商在AX,余数在DX
        MOV CX,DX        ;把余数转移到CX,商放到CX(他也是整个表达式的值得低16位)
        MOV DX,[SI];把高16位放到DX
        
        POP CX
        POP DX
        POP SI
        POP DS
        POP AX
        RET
CODES ENDS
    END START
abob
[第1楼]   [ 回复时间:2009-06-08 12:17 ]   [引用]   [回复]   [ top ] 
荣誉值:169
信誉值:0
注册日期:2008-08-19 16:07
等到学到第十二章中断楼主就明白了,继续加油啊~
需要登录后才能回帖 -->> 请单击此处登录
    Copyright © 2006-2024   ASMEDU.NET  All Rights Reserved