+ -
当前位置:首页 → 问答吧 → 过程调用失败 求指导

过程调用失败 求指导

时间:2011-07-19

来源:互联网

COMMENT /
求不超过给定自然数的各偶数之和
/
include yxf.lib

Data SEGMENT
msg1 DB 'Input a number:$'
msg2 DB 'The get number:$'
Num DW 0
Data ENDS

Stack SEGMENT Stack
DB 200 DUP(0)
Stack ENDS

Code SEGMENT
ASSUME CS:Code, SS:Stack, DS:Data

Begine:
mov ax, Data
mov ds, ax
;从终端获取数字
Print_String <offset msg1>
push Num
CALL Scanf_Int32
pop Num
Crlf

push Num
CALL Deal_Process
pop Num

; push Num
; Print_String <offset msg2>
; CALL Print_Int32
; Crlf

Exit
COMMENT /
过程名:Deal_Process
入口参数:栈顶
出口参数:栈顶
功能:
/
Deal_Process PROC
push sp
mov bp, sp
sub sp, 2;开辟空间
push cx

mov cx, 2
mov word ptr [bp-2], 0
loop_dp:
cmp cx, word ptr [bp+4]
ja next_dp
add word ptr [bp-2], cx
add cx, 2
jmp loop_dp
next_dp:
mov cx, word ptr [bp-2]
mov word ptr [bp+4], cx
push cx
CALL Print_Int32
Crlf
pop cx
mov sp, bp
pop sp
ret
Deal_Process ENDP

COMMENT /
过程名:Scanf_Int32
入口参数:栈顶, 
出口参数:栈顶, 存放收到的结果
功能:接受终端上输入的数字字符 当遇到非数字字符时结束
/
Scanf_Int32 PROC
push sp
mov bp, sp
;[bp+4]存放结果
sub sp, 2;在栈上开辟一个字空间
push ax
push cx
push dx

mov word ptr [bp+4], 0;清零
mov word ptr [bp-2], 0
mov cx, 10

loop_s_int32:
Get_Char <byte ptr [bp-2]>
cmp byte ptr [bp-2], '0'
jb over_s_int32
cmp byte ptr [bp-2], '9'
ja over_s_int32
mov ax, [bp+4]
mul cx
add ax, word ptr [bp-2]
sub ax, '0'
mov word ptr [bp+4], ax
jmp loop_s_int32

over_s_int32:
pop dx
pop cx
pop ax
mov sp, bp
pop sp
ret 
Scanf_Int32 ENDP

COMMENT /
过程名:Print_Int32
入口参数:栈顶
出口参数:无
功能:从终端上显示一个整数
/
Print_Int32 PROC
push sp
mov bp, sp
sub sp, 2;开辟一个字的空间
push dx
push ax
push cx

mov cx, 1
xor dx, dx
mov word ptr [bp-2], 10
mov ax, word ptr [bp+4]

loop_p_int32:
div word ptr [bp-2]
push dx
inc cx
cmp ax, 0;判断商是否为零
jz out_p_int32;如果是0 则递归结束
xor dx, dx
jmp loop_p_int32

out_p_int32:
dec cx
jz over_p_int32
pop dx
add dx, 48
mov byte ptr [bp-2], dl
Print_Char <byte ptr [bp-2]>
jmp out_p_int32

over_p_int32:
pop cx
pop ax
pop dx
mov sp, bp
pop sp
ret 2
Print_Int32 ENDP

Code ENDS
END Begine

作者: hanfengzhongdexiyu   发布时间: 2011-07-19

请看下的代码 可以正确:
Assembly code

COMMENT /
求不超过给定自然数的各偶数之和
    /
include yxf.lib

Data    SEGMENT
msg1    DB 'Input a number:$'
msg2    DB 'The get number:$'
Num    DW 0
Data    ENDS

Stack    SEGMENT Stack
    DB 200 DUP(0)
Stack    ENDS

Code    SEGMENT
    ASSUME CS:Code, SS:Stack, DS:Data

Begine:
    mov ax, Data
    mov ds, ax
    ;从终端获取数字
    Print_String <offset msg1>
    push Num
    CALL Scanf_Int32
    pop Num
    Crlf

    push Num
    CALL Deal_Process
    pop Num

    push Num
    Print_String <offset msg2>
    CALL Print_Int32
    Crlf
    
    Exit
COMMENT /
过程名:Deal_Process
入口参数:栈顶
出口参数:栈顶
功能:
    /
Deal_Process PROC
    push sp
    mov bp, sp
    sub sp, 2;开辟空间
    push cx
        
    mov cx, 2
    mov word ptr [bp-2], 0
loop_dp:
    cmp cx, word ptr [bp+4]
    ja next_dp
    add word ptr [bp-2], cx
    add cx, 2
    jmp loop_dp
next_dp:
    mov cx, word ptr [bp-2]
    mov word ptr [bp+4], cx
    ;push cx
    ;CALL Print_Int32
    ;Crlf

    pop cx
    mov sp, bp    
    pop sp
    ret
Deal_Process ENDP

COMMENT /
过程名:Scanf_Int32
入口参数:栈顶, 
出口参数:栈顶, 存放收到的结果
功能:接受终端上输入的数字字符 当遇到非数字字符时结束
    /
Scanf_Int32 PROC
    push sp
    mov bp, sp
    ;[bp+4]存放结果
    sub sp, 2;在栈上开辟一个字空间
    push ax
    push cx
    push dx

    mov word ptr [bp+4], 0;清零
    mov word ptr [bp-2], 0
    mov cx, 10

loop_s_int32:
    Get_Char <byte ptr [bp-2]>
    cmp byte ptr [bp-2], '0'
    jb over_s_int32
    cmp byte ptr [bp-2], '9'
    ja over_s_int32
    mov ax, [bp+4]
    mul cx
    add ax, word ptr [bp-2]
    sub ax, '0'
    mov word ptr [bp+4], ax
    jmp loop_s_int32

over_s_int32:
    pop dx
    pop cx
    pop ax
    mov sp, bp
    pop sp
    ret 
Scanf_Int32 ENDP

COMMENT /
过程名:Print_Int32
入口参数:栈顶
出口参数:无
功能:从终端上显示一个整数
    /
Print_Int32 PROC
    push sp
    mov bp, sp
    sub sp, 2;开辟一个字的空间
    push dx
    push ax
    push cx

    mov cx, 1
    xor dx, dx
    mov word ptr [bp-2], 10
    mov ax, word ptr [bp+4]

loop_p_int32:
    div word ptr [bp-2]
    push dx
    inc cx
    cmp ax, 0;判断商是否为零
    jz out_p_int32;如果是0 则递归结束
    xor dx, dx
    jmp loop_p_int32

out_p_int32:    
    dec cx
    jz over_p_int32
    pop dx
    add dx, 48
    mov byte ptr [bp-2], dl
    Print_Char <byte ptr [bp-2]>
    jmp out_p_int32

over_p_int32:    
    pop cx
    pop ax
    pop dx
    mov sp, bp
    pop sp
    ret 2
Print_Int32 ENDP

Code    ENDS
    END Begine



作者: hanfengzhongdexiyu   发布时间: 2011-07-19

怎么上传本地图片啊?

作者: hanfengzhongdexiyu   发布时间: 2011-07-19

yxf.lib 文件内容
Assembly code

;宏名:Crlf
;入口参数:无
;出口参数:无
;功能:输出一个换行符号
Crlf    MACRO    
    push dx
    push ax
    mov dl, 0ah
    mov ah, 2
    int 21h
    mov dl, 0dh
    mov ah, 2
    int 21h
    pop ax
    pop dx
    ENDM

;宏名:Print_String
;入口参数:A,字符串的首地址
;出口参数:无
;功能:输出字符串
Print_String MACRO A
    push ax
    push dx
    mov dx, A
    mov ah, 9
    int 21h
    pop dx
    pop ax
    ENDM

;宏名:Scanf_String
;入口参数:A
;出口参数:cl, 字符串的长度, si,字符串的首地址
;功能:接受从控制台输入的字符串 并进行处理
Scanf_String MACRO A
    push dx
    push ax
    mov dx, A
    mov ah, 10;调用10号
    int 21h
    
    mov si, dx
    inc si
    mov cl, [si]
    inc si
    
    pop ax
    pop dx
    ENDM

;宏名:Exit
;入口参数:无
;出口参数:无
;功能:实现程序退出
Exit    MACRO
    push ax
    mov ah, 4ch
    int 21h
    pop ax
    ENDM

;宏名:Get_Char
;入口参数:无
;出口参数:A
;功能;接受单个字符
Get_Char MACRO A
    push ax
    mov ah, 1
    int 21h
    mov A, al
    pop ax
    ENDM

;宏名:Print_Char
;入口参数:A
;出口参数:无
;功能:输出一个字符到终端
Print_Char MACRO A
    push dx
    push ax
    mov ah, 2
    mov dl, A
    int 21h
    pop ax
    pop dx
    ENDM

作者: hanfengzhongdexiyu   发布时间: 2011-07-19

热门下载

更多