| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 881 人关注过本帖
标题:看不去来怎么会值不变
只看楼主 加入收藏
诸葛修勤
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:11
帖 子:549
专家分:1955
注 册:2010-10-28
结帖率:96.55%
收藏
已结贴  问题点数:16 回复次数:13 
看不去来怎么会值不变
数组相加
程序代码:
;#Mode=CON

.386
.model flat, stdcall
option casemap :none

include Irvine32.inc
include windows.inc
include user32.inc
include kernel32.inc
include masm32.inc

includelib user32.lib
includelib kernel32.lib
includelib masm32.lib
include macro.asm

MultArray proto, x:ptr DWORD, y:ptr DWORD, z:DWORD

.data
var1    DWORD 12, 14, 15
var2    DWORD 13, 16, 17

.code
main    proc
    mov esi, offset var2
    mov ecx, lengthof var2
    mov ebx, type DWORD
    call DumpMem
   
    invoke    MultArray, addr var1, addr var2, 3
   
    call DumpMem
    call WaitMsg
    invoke ExitProcess, 0
main    endp

MultArray    proc uses esi ecx,
    x:ptr DWORD,
    y:ptr DWORD,
    z:DWORD
    mov esi, 0
    mov ecx, z
   
L:
    mov eax, [esi*type DWORD + x]
    add [esi*type DWORD + y], eax
    inc esi
    loop L
   
    ret
MultArray endp
end main

2011-03-15 22:50
诸葛修勤
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:11
帖 子:549
专家分:1955
注 册:2010-10-28
收藏
得分:0 
还想问下
问题:
    在调用子过程的时候  结尾的时候 不写 ret  编译器为什么不报错  这样的做法是不是在其他的地方可能会用到啊(譬如,用的时候要实现某些功能的时候就是不需要子过程返回到调用过程当中去啊)  还是有什么别的用意啊?

谁知道 就帮下   目前不理解
2011-03-15 22:58
zaixuexi
Rank: 12Rank: 12Rank: 12
来 自:上海
等 级:火箭侠
威 望:8
帖 子:858
专家分:3233
注 册:2010-12-1
收藏
得分:10 
1. 好像没什么错么
2. ret就是一句指令,编译器为什么要报错呢

技术问题,请不要以短消息方式提问
2011-03-16 10:05
ansic
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:恍惚窈冥
等 级:城市猎人
帖 子:1543
专家分:5367
注 册:2011-2-15
收藏
得分:6 
子程序必须要同ret返回调用者的
PS:
MultArray    proc uses esi ecx,  //这里的逗号多余吧。

善人者,不善人之师;不善人者,善人之资。不贵其师,不爱其资,虽智大迷。
2011-03-16 10:10
诸葛修勤
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:11
帖 子:549
专家分:1955
注 册:2010-10-28
收藏
得分:0 
回复 4楼 ansic
不是  要加上逗号  可以和上面的调用一起看也可以 proc uses后面要保留的寄存器 可以不要 但是后面还是有逗号(个人看法)
invoke    MultArray, addr var1, addr var2, 3
2011-03-16 12:30
诸葛修勤
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:11
帖 子:549
专家分:1955
注 册:2010-10-28
收藏
得分:0 
回复 3楼 zaixuexi
子过程 结束后 要回到调用过程中 必须要ret 这样压入运行栈中的返回地址才能传给 esp
继续运行下去, 所以不加上这句不报错有点接受不了(主过程 另当别论)

本来这个问题的目的是想了解下  是不是有的时候会用到 子过程 不用返回的情况 当然这样加不加上ret 就没什么必要了
2011-03-16 12:38
zaixuexi
Rank: 12Rank: 12Rank: 12
来 自:上海
等 级:火箭侠
威 望:8
帖 子:858
专家分:3233
注 册:2010-12-1
收藏
得分:0 
回复 6楼 诸葛修勤
没有必须这种讲法
ret就是一条指令,不返回不可以么,大不了程序跑飞,编译器为什么要管这个呢

技术问题,请不要以短消息方式提问
2011-03-16 13:03
诸葛修勤
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:11
帖 子:549
专家分:1955
注 册:2010-10-28
收藏
得分:0 
回复 7楼 zaixuexi
好吧  感觉是有点小题做大了   
谢谢LS啦  刚接触有点不适应还
2011-03-16 13:14
zaixuexi
Rank: 12Rank: 12Rank: 12
来 自:上海
等 级:火箭侠
威 望:8
帖 子:858
专家分:3233
注 册:2010-12-1
收藏
得分:0 
以下是引用诸葛修勤在2011-3-16 13:14:16的发言:

好吧  感觉是有点小题做大了   
谢谢LS啦  刚接触有点不适应还
不是的,你没清楚编译器和链接器的功能.编译器不会去判断你程序逻辑的.

技术问题,请不要以短消息方式提问
2011-03-16 14:08
寒风中的细雨
Rank: 17Rank: 17Rank: 17Rank: 17Rank: 17
等 级:贵宾
威 望:66
帖 子:1710
专家分:8645
注 册:2009-9-15
收藏
得分:0 
这个是属于逻辑(语义)错误

一开始我就没有把它当做是一个逻辑错误(看来是自己认识不够) 认为它是--语法错误   所以就。。。

就像
int function()
{
    int x = ~~;
    //return x;
} 明确是有返回值的 而没有 return 相应的类型值 (这个在编译阶段语法分析肯定是无法通过的)
2011-03-16 16:24
快速回复:看不去来怎么会值不变
数据加载中...
 
   



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

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