过程调用失败 求指导
时间: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
求不超过给定自然数的各偶数之和
/
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
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
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
相关阅读 更多
热门阅读
-
office 2019专业增强版最新2021版激活秘钥/序列号/激活码推荐 附激活工具
阅读:74
-
如何安装mysql8.0
阅读:31
-
Word快速设置标题样式步骤详解
阅读:28
-
20+道必知必会的Vue面试题(附答案解析)
阅读:37
-
HTML如何制作表单
阅读:22
-
百词斩可以改天数吗?当然可以,4个步骤轻松修改天数!
阅读:31
-
ET文件格式和XLS格式文件之间如何转化?
阅读:24
-
react和vue的区别及优缺点是什么
阅读:121
-
支付宝人脸识别如何关闭?
阅读:21
-
腾讯微云怎么修改照片或视频备份路径?
阅读:28