用汇编语言编写子程序后如何调用?

发布网友 发布时间:2022-04-28 10:39

我来回答

2个回答

热心网友 时间:2023-09-28 01:20

如果汇编语言自己调用就用个call 就行了,给你举个例子:在运行到需要调用的时候这样用:
call crlf //这里调用crlf这个子程序
crlf proc near //这里写名为crlf的子程序
//子程序代码
ret
crlf endp

热心网友 时间:2023-09-28 01:20

1234567101112131415161718192021222324252627282930313233343536373839404142434445474849505152535455565758596061626365666768697071727374757677787980818283848586878890919293949596979910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216311651661671681691701711721731741751761771781791801811821831841851861871881190191192193194195196197198199200201202203204205206207                                                                                                                                             208                                                                                                                                               209                                                                                                                                         210

CODE  SEGMENT

ASSUME    CS:CODE

ORG       100H

START:  PUSH      CS

POP       DS

PUSH      CS

POP       ES

MOV       DI,0

MOV       SI,0

MOV       BX,10

@MAIN1:  MOV       CX,BX

CALL      FACT

ADD       SI,AX

ADC       DI,DX

DEC       BX

JNZ       @MAIN1

MOV       AX,SI

MOV       DX,DI

CALL      DISPDXAX

MOV       AH,4CH

INT       21H

 

; cx中存放要求阶乘的数 

; 阶乘结果在dx、ax中 

FACT  PROC      NEAR

PUSH      BX

PUSH      SI

PUSH      DI

PUSHF

MOV       DX,0

MOV       AX,1

@FACT1:  MOV       BX,CX

CALL      MULT

LOOP      @FACT1

POPF

POP       DI

POP       SI

POP       BX

RET

FACT  ENDP

 

; 将要显示的无符号数置于 ax 中 

DISPAX  PROC      NEAR

PUSH      BX

PUSH      CX

PUSH      DX

PUSH      SI

PUSH      DS

PUSH      CS

POP       DS

MOV       BYTE PTR NZ,0

PUSH      AX

LEA       SI,DIVARR

MOV       CX,5

@1:

POP       AX

MOV       DX,0

MOV       BX,[SI]

DIV       BX

PUSH      DX

CMP       AL,0

JNE       @2

CMP       BYTE PTR NZ,1

JE        @2

CMP       CX,1

JE        @2

MOV       DL,20H

JMP       @3

@2:

ADD       AL,30H

MOV       DL,AL

MOV       BYTE PTR NZ,1

@3:

MOV       AH,2

INT       21H

INC       SI

INC       SI

LOOP      @1

POP       DX

POP       DS

POP       SI

POP       DX

POP       CX

POP       BX

RET

DIVARR  DW        10000,1000,100,10,1

NZ  DB        0

DISPAX  ENDP

 

; 无符号乘法子程序 (mul指令只能实现16位乘16位,本子程序实现32位乘16位--限定数的大小,结果仍为32位) 

; 被乘数放置于dx,ax 中, 乘数放置于 bx中 

; 结果放置于dx,ax中(dx为高16位,ax为低16位) 

MULT  PROC      NEAR

PUSH      CX

PUSH      SI

PUSH      DI

PUSHF

MOV       SI,0

MOV       DI,0

CMP       BX,0

JE        @MULTEXIT

@MULT1:  SHR       BX,1

JNC       @MULT2

ADD       SI,AX

ADC       DI,DX

@MULT2:  SHL       AX,1

RCL       DX,1

CMP       BX,0

JNE       @MULT1

MOV       DX,DI

MOV       AX,SI

POPF

POP       DI

POP       SI

POP       CX

RET

@MULTEXIT:

MOV       AX,0

MOV       DX,0

POPF

POP       DI

POP       SI

POP       CX

RET

MULT  ENDP

 

; 将要显示的32位无符号数置于dx、ax中 

DISPDXAX  PROC      NEAR

MOV       WORD PTR [Y],AX

MOV       WORD PTR [Y+2],DX

; 以下将 Y (16进制)转为10进制串并输出

MOV       AX,WORD PTR [Y]         ;=====

MOV       DX,WORD PTR [Y+2]       ;=====

MOV       BX,WORD PTR [Z]         ;=====  这一段是关键,加上后不会出现除法溢出

MOV       CX,WORD PTR [Z+2]       ;=====

MOV       WORD PTR N,0            ;=====

MM0:  INC       WORD PTR N  ;=====

SUB       AX,BX       ; 不停地减 10万 ,得到被10万除的商,放在 n 中

SBB       DX,CX       ;=====

JNC       MM0         ;=====

DEC       WORD PTR N  ;  保存 高5位

ADD       AX,BX       ;=====

ADC       DX,CX       ;=====

MOV       WORD PTR[Y],AX          ;=====

MOV       WORD PTR[Y+2],DX        ;=====

;==============

MM1:  LEA       DI,CC

ADD       DI,9

M2:

MOV       AX,WORD PTR [Y]

MOV       DX,WORD PTR [Y+2]

MOV       BX,10000

DIV       BX          ; 这里是发生溢出之处

PUSH      AX

PUSH      DX

; ============

; 以下转换10进制的低4位

POP       DX

MOV       CX,4

MOV       AX,DX

M3:  MOV       DX,0

MOV       BX,10

DIV       BX

ADD       DL,30H

MOV       [DI],DL

DEC       DI

LOOP      M3

; ===========

; 以下转换10进制的高万位

POP       AX

MOV       CX,1

M4:  MOV       DX,0

MOV       BX,10

DIV       BX

ADD       DL,30H

MOV       [DI],DL

DEC       DI

LOOP      M4

;=============

MOV       AX,WORD PTR N

MOV       CX,5

M5:  MOV       DX,0

MOV       BX,10

DIV       BX

ADD       DL,30H

MOV       [DI],DL

DEC       DI

LOOP      M5

; ============

; 输出换行回车

LEA       DX,LFCR

MOV       AH,9

INT       21H

; ============

; 输出两数的和的10进制串

LEA       DX,CC

MOV       AH,9

INT       21H

RET

Y  DD        ?

CC  DB        10 DUP(' '),10,13,'$'

LFCR  DB        10,13,'$'

Z  DD        100000

N  DW        0

DISPDXAX  ENDP

CODE  ENDS

END       START

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com