标题:关于压栈和 START TROC FAR 的困惑
只看楼主
lxtxwyl
Rank: 1
来 自:山东济南
等 级:新手上路
帖 子:29
专家分:0
注 册:2008-7-29
 问题点数:0 回复次数:11 
关于压栈和 START TROC FAR 的困惑
本人刚接触汇编不久,对于压栈
START :MOV AX,DATA_SEG
       MOV DS,AX
开始的程序和START  PROC   FAR  开始的程序有什么区别不是很了解,用得时候经常混用!请解释一下              
START        PROC   FAR               
BEGIN:       PUSH  DS
             XOR  AX, AX
             PUSH  AX
搜索更多相关主题的帖子: START FAR TROC 困惑 
2008-10-31 22:11
lxtxwyl
Rank: 1
来 自:山东济南
等 级:新手上路
帖 子:29
专家分:0
注 册:2008-7-29
得分:0 
貌似没人回答啊
2008-10-31 23:07
lxtxwyl
Rank: 1
来 自:山东济南
等 级:新手上路
帖 子:29
专家分:0
注 册:2008-7-29
得分:0 
斑竹在不在啊
2008-10-31 23:41
cnhanxiao
Rank: 2
等 级:新手上路
威 望:4
帖 子:124
专家分:0
注 册:2008-10-17
得分:0 
START :MOV AX,DATA_SEG
       MOV DS,AX
规定了程序入口,并对数据段进行装填。

START        PROC   FAR               
BEGIN:       PUSH  DS
             XOR  AX, AX
             PUSH  AX
以过程方式写程序,压栈DS、AX,以保证这个过程可以被系统直接调用,并能以ret指令安全返回系统,这是系统要求的。类似:
mov ah,4ch
int 21h

还有绑架成版主的?拒绝做版主——对不起啊!
2008-11-01 00:22
lxtxwyl
Rank: 1
来 自:山东济南
等 级:新手上路
帖 子:29
专家分:0
注 册:2008-7-29
得分:0 
我还是不太明白
我可以发两个例子你给解析一下吗
2008-11-01 00:42
lxtxwyl
Rank: 1
来 自:山东济南
等 级:新手上路
帖 子:29
专家分:0
注 册:2008-7-29
得分:0 
DATA_SEG    SEGMENT
    M1    DW    0058H
    M2    DW    012AH
    M3    DW    ?
    M4    DW    ?
    DATA_SEG    ENDS
 
    STACK_SEG  SEGMENT
    S_DATA    DB    100 DUP(?)
    TOP           EQU    LENGTH   S_DATA
    STACK_SEG  ENDS
 
    CODE_SEG    SEGMENT
           ASSUME  CS:CODE_SEG,   DS:DATA_SEG,   SS:STACK_SEG
    START:   MOV   AX, DATA_SEG
                      MOV   DS, AX
                      MOV   AX, STACK_SEG
                      MOV   SS, AX
                      MOV   AX, TOP
                      MOV   SP, AX
                      MOV    BX, OFFSET  M1
                            MOV   AX, [BX]
                            MOV   DX, 0
                            MOV   BX, OFFSET M2
                            MUL   [BX]
                            MOV   BX, OFFSET M3
                            MOV   [BX], AX
                            MOV   BX, OFFSET M4
                            MOV   [BX], DX
                            MOV  AH, 4CH
                             INT  21H
   DOCE_SEG   ENDS
                            END   START
这个是压栈的
2008-11-01 00:42
lxtxwyl
Rank: 1
来 自:山东济南
等 级:新手上路
帖 子:29
专家分:0
注 册:2008-7-29
得分:0 
上面那个是求出两个16位数M1和M2的积
2008-11-01 00:43
lxtxwyl
Rank: 1
来 自:山东济南
等 级:新手上路
帖 子:29
专家分:0
注 册:2008-7-29
得分:0 
这个是两个32位无符号数相乘
DATA            SEGMENT
MULNUM     DW   0010, 0A100H, 0000, 0FFFFH, 4 DUP(?)
DATA            ENDS

STACK          SEGMENT  PARA ‘STACK’
                       DB  100 DUP(?)
TOP                EQU    LENGTH   STACK
STACK          ENDS
 
CODE            SEGMENT
                       ASSUME  CS:CODE, DS:DATA, SS:STACK
START         PROC   FAR            ;将本程序作为DOS操作系统的子程。         
BEGIN:         PUSH  DS
                       XOR  AX, AX
                       PUSH  AX                      ; 标准程序前缀  
                       MOV  AX, DATA
                       MOV  DS, AX
                       MOV  ES, AX  
                       MOV  AX, STACK
                 MOV  SS, AX
                 MOV  AX, TOP
                 MOV  SP, AX                   ; 以上为设置段地址
                                                ;和栈指针
                 LEA   BX, MULNUM         ;取数据的首地址
MUL32:  MOV  AX, [BX]                   ;取D12至AX
                 MOV  SI, [BX+4]                 ;取D22至SI
                 MOV  DI, [BX+6]                 ;取D21至DI
                 MUL  SI                                 ;D12×D22
                 MOV  [BX+8], AX                ;存部分积1
                 MOV  [BX+0AH], DX
                 MOV  AX, [BX+2]                ;取D11至AX
                 MUL  SI                                 ; D11×D22
                 ADD  AX, [BX+0AH]
                 ADC  DX, 0                           ;部分积相应部分相加
                 MOV  [BX+0AH], AX
                 MOV  [BX+0CH], DX          ;存中间结果
                  MOV  AX, [BX]                  ;取D12至AX
                MUL  DI                             ; D12×D21
                ADD  AX, [BX+0AH]
                ADC  DX, [BX+0CH]        ;部分积相应部分相加
                MOV  [BX+0AH], AX       ;存中间结果
                MOV  [BX+0CH], DX
                PUSHF                                 ;保存上次计算的进位位
                MOV  AX, [BX+2]              ;取D11至AX
                MUL  DI                              ;与D21相乘
                POPF                                    ;取上次的进位位
                  ADC  DX, 0
                ADD  AX, [BX+0CH]
                ADC  DX, 0                         ;部分积相加
                MOV  [BX+0CH], AX
                MOV  [BX+0EH], DX         ;存结果
                RET                                       ; 返回到DOS
Start   endp
CODE    ENDS
               END  BEGIN
2008-11-01 00:47
cnhanxiao
Rank: 2
等 级:新手上路
威 望:4
帖 子:124
专家分:0
注 册:2008-10-17
得分:0 
你在线啊:)
很久不接触DOS下汇编程序了。
你六楼发的程序属于常用的书写格式,这里不存在压栈不压栈的问题。其实你去掉堆栈段也没影响的,系统按照默认堆栈为程序分配堆栈的。

至于用过程书写程序,系统要求必须先压栈返回地址,不然,等程序结束时候,就跑飞了,不会返回DOS了。那是给程序结束是最后一条指令RET使用的。

还有绑架成版主的?拒绝做版主——对不起啊!
2008-11-01 00:48
lxtxwyl
Rank: 1
来 自:山东济南
等 级:新手上路
帖 子:29
专家分:0
注 册:2008-7-29
得分:0 
那你的意思是第一个是不是可以去掉压栈的过程?
2008-11-01 00:49



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-241766-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.203339 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved