您现在的位置是:首页 >

汇编语言有多少种 用汇编语言编写子程式后如何呼叫?

火烧 2023-04-13 12:59:35 1092
用汇编语言编写子程式后如何呼叫? 用汇编语言编写子程式后如何呼叫?用汇编语言编写子程式后如何呼叫?我想我们会在一起的我觉得自己很幸福,我不再是一条孤独流浪的鱼,我有岸可度,岸的一端你在那。好意思 一开

用汇编语言编写子程式后如何呼叫?  

用汇编语言编写子程式后如何呼叫?

用汇编语言编写子程式后如何呼叫?
我想我们会在一起的我觉得自己很幸福,我不再是一条孤独流浪的鱼,我有岸可度,岸的一端你在那。

好意思 一开始没有看到”呼叫子程式“ 已改正:
data segment
array db '8750423196 $'
data ends
code segment
assume cs:code
main proc far
start:
push ds
sub ax,ax
push ax
mov ax,data
mov ds,ax

call son
ret
main endp
son proc near
mov cx,9
loop2:
mov bx,cx
lea di,array
loop1:
mov al,[di]
cmp al,[di 1]
jle next
xchg al,[di 1]
mov [di],al
next:
inc di
loop loop1
mov cx,bx
loop loop2
output:
lea dx,array
mov ah,9
int 21h
ret
code ends
end start

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207                                                                                                                                             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

通过C语言函式形式封装组合语言程式段,而后就可完全按照C语言函式的形式呼叫。这种方法保证了子程式段与主程式衔接的完全适配,使用简便。使用方法如下:
用低划线_后接关键字asm指示后面的语句是汇编语句。汇编语句既可以是单句,例如__asm mov bx,1;也可以是复合语句,即,用花括号对包含的多条单句,例如:
__asm
{ mov al, 3
mov dx, 0xE008
add ax,dx
}
在语法规则中,这些语句与C语言的语句完全等价。因此,可以直接进行编译。

组合语言中子程式可以呼叫子程式吗

组合语言中子程式当然是可以呼叫其他子程式的。
我们程式设计时,之所以要引入子程式,其主要目的无非就是:减少重复程式码;阅读方便;流程清晰;举例如下:
MAIN:
MOV A,#0FEH
MOV R2,#8
LOOP:
LCALL KEYSCAN
JB 00H,LOOP1
MOV P0,A
RL A
MOV R7,#200
LCALL DELAY
SJMP LOOP
LOOP1:
RR A
MOV R7,#200
LCALL DELAY
SJMP LOOP
KEYSCAN: ;按键检测子程式
JB P1.0,KEYR ;没有按键退出
MOV R7,#20 ;延时子程式传递引数
LCALL DELAY ;呼叫延时子程式
JNB P1.0,$ ;等待按键抬起
CPL 00H ;按键处理 位00H取反
KEYR:
RET
DELAY:
MOV R3,#250
DJNZ R3,$
DJNZ R7,DELAY
RET
END

用汇编语言编写一个延时1S的子程式

; 本程式通过编译,执行正确
Code Segment
Assume CS:Code,DS:Code
; -----------------------------------------
; Subroutine 延时指定的时钟嘀嗒数
; 入口:
; Didas=时钟嘀嗒数(1秒钟约嘀嗒18.2次,10秒钟嘀嗒182次。若延时不是秒的10数次倍,误差稍微大点)
Delay1S Proc Near
push dx
push cx
xor ax,ax
int 1ah
mov Times,dx
mov Times[2],cx
Read_Time: xor ax,ax
int 1ah
sub dx,Times
sbb cx,Times[2]
cmp dx,Didas
jb Read_Time
pop cx
pop dx
ret
Times dw 0,0
Delay1S EndP
; -----------------------------------------
Didas equ 18
Start: call Delay1S
Exit_Proc: mov ah,4ch ;结束程式
int 21h
Code ENDS
END Start ;编译到此结束

在kei里,用C语言编写了主程式,怎么呼叫用汇编编写的延时子程式?

这里有详细例子
呵呵
:apps.hi.baidu./share/detail/22861551

用汇编语言(子程式设计)编写计算1+2+3+……+99=?的程式。怎么编写

;
ADD1_99:
MOV AX, 0
MOV CX, 99
LP: ADD AX, CX
LOOP LP
RET
END

用汇编语言编制在萤幕上画线的子程式,呼叫该子程式画一矩形。

下面程式整合画几色线,画方框,画方块功能。
是DEBUG自动汇出的。不知好懂不?
你可进DEBUG再汇编一遍。
IP: 机器程式码 在DEBUG中U命令反汇编后的原始码
0100 B80400 MOV AX,0004
0103 CD10 INT 10
0105 B40B MOV AH,0B
0107 BB0001 MOV BX,0100
010A CD10 INT 10
010C B40B MOV AH,0B
010E BB0000 MOV BX,0000
0111 CD10 INT 10
0113 BA0100 MOV DX,0001
0116 B8010C MOV AX,0C01
0119 B91900 MOV CX,0019
011C CD10 INT 10
011E 42 INC DX
011F 81FAC000 CMP DX,00C0
0123 72F1 JB 0116
0125 B90100 MOV CX,0001
0128 BA0100 MOV DX,0001
012B B8010C MOV AX,0C01
012E CD10 INT 10
0130 41 INC CX
0131 81F90001 CMP CX,0100
0135 72F1 JB 0128
0137 B90200 MOV CX,0002
013A BA0200 MOV DX,0002
013D B8070C MOV AX,0C07
0140 CD10 INT 10
0142 41 INC CX
0143 42 INC DX
0144 81F9C000 CMP CX,00C0
0148 72F3 JB 013D
014A B408 MOV AH,08
014C CD21 INT 21
014E B80600 MOV AX,0006
0151 CD10 INT 10
0153 B40B MOV AH,0B
0155 BB0001 MOV BX,0100
0158 CD10 INT 10
015A B40B MOV AH,0B
015C BB0000 MOV BX,0000
015F CD10 INT 10
0161 BA0100 MOV DX,0001
0164 B8010C MOV AX,0C01
0167 B91900 MOV CX,0019
016A CD10 INT 10
016C 42 INC DX
016D 81FAC000 CMP DX,00C0
0171 72F1 JB 0164
0173 B90100 MOV CX,0001
0176 BA0100 MOV DX,0001
0179 B8010C MOV AX,0C01
017C CD10 INT 10
017E 41 INC CX
017F 81F90002 CMP CX,0200
0183 72F1 JB 0176
0185 B90200 MOV CX,0002
0188 BA0200 MOV DX,0002
018B B8070C MOV AX,0C07
018E CD10 INT 10
0190 83C102 ADD CX,+02
0193 42 INC DX
0194 81FAC000 CMP DX,00C0
0198 72F1 JB 018B
019A B408 MOV AH,08
019C CD21 INT 21
019E B80400 MOV AX,0004
01A1 CD10 INT 10
01A3 B40B MOV AH,0B
01A5 BB0001 MOV BX,0100
01A8 CD10 INT 10
01AA B40B MOV AH,0B
01AC BB0000 MOV BX,0000
01AF CD10 INT 10
01B1 BA1900 MOV DX,0019
01B4 B91400 MOV CX,0014
01B7 B8010C MOV AX,0C01
01BA CD10 INT 10
01BC 41 INC CX
01BD 81F9FF00 CMP CX,00FF
01C1 75F4 JNZ 01B7
01C3 B8010C MOV AX,0C01
01C6 CD10 INT 10
01C8 42 INC DX
01C9 83FA78 CMP DX,+78
01CC 75F5 JNZ 01C3
01CE B8010C MOV AX,0C01
01D1 CD10 INT 10
01D3 49 DEC CX
01D4 83F914 CMP CX,+14
01D7 75F5 JNZ 01CE
01D9 B8010C MOV AX,0C01
01DC CD10 INT 10
01DE 4A DEC DX
01DF 83FA19 CMP DX,+19
01E2 75F5 JNZ 01D9
01E4 B400 MOV AH,00
01E6 CD16 INT 16
01E8 BA1900 MOV DX,0019
01EB B91400 MOV CX,0014
01EE B8010C MOV AX,0C01
01F1 CD10 INT 10
01F3 41 INC CX
01F4 81F9FF00 CMP CX,00FF
01F8 75F4 JNZ 01EE
01FA B8010C MOV AX,0C01
01FD CD10 INT 10
01FF 42 INC DX
0200 81FAC000 CMP DX,00C0
0204 75F4 JNZ 01FA
0206 B8010C MOV AX,0C01
0209 CD10 INT 10
020B 49 DEC CX
020C 83F914 CMP CX,+14
020F 75F5 JNZ 0206
0211 B8010C MOV AX,0C01
0214 CD10 INT 10
0216 4A DEC DX
0217 83FA19 CMP DX,+19
021A 75F5 JNZ 0211
021C B400 MOV AH,00
021E CD16 INT 16
0220 B40B MOV AH,0B
0222 BB0101 MOV BX,0101
0225 CD10 INT 10
0227 B40B MOV AH,0B
0229 BB0000 MOV BX,0000
022C CD10 INT 10
022E BA1900 MOV DX,0019
0231 B91400 MOV CX,0014
0234 B8010C MOV AX,0C01
0237 CD10 INT 10
0239 41 INC CX
023A 81F9FF00 CMP CX,00FF
023E 72F4 JB 0234
0240 B8020C MOV AX,0C02
0243 CD10 INT 10
0245 42 INC DX
0246 83FA78 CMP DX,+78
0249 75F5 JNZ 0240
024B B8030C MOV AX,0C03
024E CD10 INT 10
0250 49 DEC CX
0251 83F914 CMP CX,+14
0254 75F5 JNZ 024B
0256 B8020C MOV AX,0C02
0259 CD10 INT 10
025B 4A DEC DX
025C 83FA19 CMP DX,+19
025F 75F5 JNZ 0256
0261 B400 MOV AH,00
0263 CD16 INT 16
0265 BA2000 MOV DX,0020
0268 B92500 MOV CX,0025
026B B8050C MOV AX,0C05
026E CD10 INT 10
0270 41 INC CX
0271 81F91001 CMP CX,0110
0275 75F4 JNZ 026B
0277 B8060C MOV AX,0C06
027A CD10 INT 10
027C 42 INC DX
027D 81FAC500 CMP DX,00C5
0281 75F4 JNZ 0277
0283 B8070C MOV AX,0C07
0286 CD10 INT 10
0288 49 DEC CX
0289 83F925 CMP CX,+25
028C 75F5 JNZ 0283
028E B8020C MOV AX,0C02
0291 CD10 INT 10
0293 4A DEC DX
0294 83FA20 CMP DX,+20
0297 75F5 JNZ 028E
0299 B400 MOV AH,00
029B CD16 INT 16
029D B40B MOV AH,0B
029F BB0001 MOV BX,0100
02A2 CD10 INT 10
02A4 B400 MOV AH,00
02A6 CD16 INT 16
02A8 B40B MOV AH,0B
02AA BB0001 MOV BX,0100
02AD CD10 INT 10
02AF B40B MOV AH,0B
02B1 BB0000 MOV BX,0000
02B4 CD10 INT 10
02B6 BA1900 MOV DX,0019
02B9 E81700 CALL 02D3
02BC 42 INC DX
02BD 81FAA000 CMP DX,00A0
02C1 7702 JA 02C5
02C3 EBF4 JMP 02B9
02C5 B400 MOV AH,00
02C7 CD16 INT 16
02C9 B80300 MOV AX,0003
02CC CD10 INT 10
02CE B44C MOV AH,4C
02D0 CD20 INT 20
02D2 90 NOP
02D3 B91400 MOV CX,0014
02D6 B8010C MOV AX,0C01
02D9 CD10 INT 10
02DB 41 INC CX
02DC 81F9FF00 CMP CX,00FF
02E0 75F4 JNZ 02D6
02E2 C3 RET
02E3 0000 ADD [BX+SI],AL
02E5 0000 ADD [BX+SI],AL

c主程式调用汇编子程式

1、C端和汇编端保持相同的呼叫约定(cdecl或stdcall)
2、C++请用extern "C"申明
3、暂时想不到了

  
永远跟党走
  • 如果你觉得本站很棒,可以通过扫码支付打赏哦!

    • 微信收款码
    • 支付宝收款码