n start push ax n mov ax data

  • Slides: 85
Download presentation

n start: push ax n mov ax, data n mov ds, ax n mov

n start: push ax n mov ax, data n mov ds, ax n mov ax, stack n mov ss, ax n mov sp, top n mov bx, offset table n next: mov dx, offset buf ; 9号功能调 用,显示字符串,提示输入一个数 n mov ah, 9 n int 21 h 8

n n n n n mov ah, 1 入一个数且送 AL int 21 h mov

n n n n n mov ah, 1 入一个数且送 AL int 21 h mov ah, 0 值 and al, 0 fh add bx, ax mov al, [bx] mov ah, 4 ch int 21 h code ends end start ; 1号功能调入,等待键 ;查表得键入数的平方 ;屏蔽高 4位 9

n 源程序如下: n n n n n data segment x dw 15 y dw?

n 源程序如下: n n n n n data segment x dw 15 y dw? data ends stack segment stack ’stack’ db 100 dup(? ) stack ends code segment assume cs: code, ds: data, ss: stack 11

n n n n n start: push ax mov ax, data mov ds, ax

n n n n n start: push ax mov ax, data mov ds, ax mov ax, x and ax, ax jz xero jns zero mov bx, offffh jmp done n 12

zero: mov bx, 0 jmp done n plus: mov bx, 1 done: mov y,

zero: mov bx, 0 jmp done n plus: mov bx, 1 done: mov y, bx n mov ah, 4 ch n int 21 h code ends n end start n 13

data segment n buf db 15 h , 37 h, 86 h n db

data segment n buf db 15 h , 37 h, 86 h n db 0 a 7 h, 0 c 8 h, 90 h, 7 eh, 50 h n db 80 h , 23 h n cout equ $ -buf n data ends n stack segment stack’ n sap db 100 dup(? ) n top equ length sap n stack ends n code segment n n n assume cs : code, ds: data, ss: stack 20

n n n n start: mov ax, data mov ds, ax mov ax, stack

n n n n start: mov ax, data mov ds, ax mov ax, stack mov ss, ax mov sp, top mov bx, offset buf mov cx, cout-1 n 21

lpo 1: n lpo 2: mov dx, cx mov al, [bx] n cmp al,

lpo 1: n lpo 2: mov dx, cx mov al, [bx] n cmp al, [bx+1] n jle next n xchg al, [bx+1] n mov[bx], al n mext: inc bx n loop lop 2 n mov cx, dx n loop lop 1 n mov ah, 4 ch n int 21 h n code ends n end start n 22

n n n 例4. 11 在数据段中定义了两个数组,编程实现数组分 别求和。 data segment art 1 db 12, 23,

n n n 例4. 11 在数据段中定义了两个数组,编程实现数组分 别求和。 data segment art 1 db 12, 23, 34, 45, 56, 67, 78, 89, 90, 18 contl equ $ -ary 1 sum 1 dw? ary 2 db 13 h, 24 h, 57 h , 68 h, 9 ah, 0 bch, 0 cdh, 0 deh, 80 h cont 2 equ $ -ary 2 sum 2 dw? data ends code segment assume cs: code, cs: data 26

n start: n n mov ax, data mov ds, ax lea si ary 1

n start: n n mov ax, data mov ds, ax lea si ary 1 ;入口参数,数据 块 1首址 mov cx, cont 1 n ;入口参数,数 据块 1长度 call sum lea si, ary 2 n n ;调用求和子程序 ;入口参数,数据 块 2首址 mov cx, cont 2 n ;入口参数,数 据块 2长度 n n n call sum mov ah, 4 ch int 21 h 27

 n sum n proc xor ax, ax 放和 n next 1: add al,

n sum n proc xor ax, ax 放和 n next 1: add al, [si] 加 n adc ah, 0 中 n inc si n loop mext 1 n mov[si], ax 内存单元 n ret n sum endp n code ends n end star ;子程序sum ;ax清0,存 ;数组元素相 ;高位放在ah ;数组和存入 28

32

32

程序如下: STACK SEGMENT STACK DB 200 DUP(0) STACK EDNS DATA SEGMENT BUF DW 001111001011

程序如下: STACK SEGMENT STACK DB 200 DUP(0) STACK EDNS DATA SEGMENT BUF DW 001111001011 B COUNT DB ? DATA ENDS CODE SEGMENT ASSUME DS: DATA, CS: CODE, SS: STACK 33

START: MOV AX,DATA MOV DS,AX MOV AX,BUF MOV CL,0 ;计数器为 0 LOPA: AND AX,AX;

START: MOV AX,DATA MOV DS,AX MOV AX,BUF MOV CL,0 ;计数器为 0 LOPA: AND AX,AX; 使CF位为 0 JE EXIT ;(AX)=0,结束循环 SHL AX,1;AX 左移一位 JNC LOPA INC CL ;产生进位,(CL)+1→CL JMP LOPA EXIT: MOV COUNT,CL MOV AH,4 CH INT 21 H CODE ENDS END START 34

37

37

程序如下: DATA SEGMENT BUF DW 3,-4,6,7,9,2,0,-8,-9,10,20 N=($-BUF)/2 DATA ENDS STACK SEGNMENT STACK DB 200

程序如下: DATA SEGMENT BUF DW 3,-4,6,7,9,2,0,-8,-9,10,20 N=($-BUF)/2 DATA ENDS STACK SEGNMENT STACK DB 200 DUP(0) STACK ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA,SS: 38 STACK

START: MOV MOV DEC AX,DATA DS,AX CX,N CX;设计数器CX内循环 39

START: MOV MOV DEC AX,DATA DS,AX CX,N CX;设计数器CX内循环 39

LOOP 1: MOV LOOP 2: MOV L: DX,CX;设计数器DX外循环 BX,0 AX,BUF[BX] CMP AX,BUF[BX+2] JGE L;

LOOP 1: MOV LOOP 2: MOV L: DX,CX;设计数器DX外循环 BX,0 AX,BUF[BX] CMP AX,BUF[BX+2] JGE L; >=, 不变,否则交换 XCHG AX,BUF[BX+2] MOV ADD DEC JNE MOV LOOP BUF[BX],AX BX,2 CX LOOP 2;相当于LOOP 2 CX,DX; LOOP 1 40

┆ POP DX POP CX POP BX ;恢复现场 POP AX RET ;返回断点处 PROC ENDP

┆ POP DX POP CX POP BX ;恢复现场 POP AX RET ;返回断点处 PROC ENDP 47

CODE SEGMENT ASSUME DS:DATA,CS:CODE, SS:STACK START: MOV AX,DATA MOV DS,AX MOV DX,0 MOV DL,NUM

CODE SEGMENT ASSUME DS:DATA,CS:CODE, SS:STACK START: MOV AX,DATA MOV DS,AX MOV DX,0 MOV DL,NUM 8 ;转换二进制数送DX MOV CX,8 ;置位数 8 LEA DI,ASCBUF ;字符串首址→DI CALL ;调用子程序BTASC MOV BYTE PTR [DI],0 DH MOV BYTE PTR [DI+1],0 AH 51

MOV LEA MOV INT MOV LEA CALL MOV MOV 串 LEA MOV INT BYTE

MOV LEA MOV INT MOV LEA CALL MOV MOV 串 LEA MOV INT BYTE PTR [DI+2], ‘$’ DX,ASCBUF AH,9 21 H DX,NUM 16 CX,16 ;置位数 16 DI,ASCBUF BTASC BYTE PTR [DI],0 DH BYTE PTR [DI+1],0 AH BYTE PTR [DI+2], ‘$’;显示转换后的字符 DX, ASCBUF AH,9 21 H 52

BTASC L 1: PROC PUSH MOV CMP JNE MOV ROL RCL ADD MOV INC

BTASC L 1: PROC PUSH MOV CMP JNE MOV ROL RCL ADD MOV INC LOOP POP AX RET AX ;保存AX AL,0 CX,8 ;比较8位数 L 1 ;直接转换 16位数 DH,DL; 8位数转换送DH DX, ,1 ;DX最高位移入CF AL,1 ;CF移入AL最低位 AL,30 H [DI],AL DI L 1 53

CODE ENDS END START 54

CODE ENDS END START 54

【例4. 16】计算 5!的程序示例, RESULT是保存 阶乘的存储单元。 程序如下: STACK SEGMENT STACK DB 200 DUP(0) STACK ENDS

【例4. 16】计算 5!的程序示例, RESULT是保存 阶乘的存储单元。 程序如下: STACK SEGMENT STACK DB 200 DUP(0) STACK ENDS DATA SEGMENT N DW 5 RESULT DW ? DATA ENDS CODE SEGMENT ASSUME CS:CODE, SS:STACK,DS: 56 DATA

START: MOV MOV CALL MOV INT AX,DATA DS,AX AX,N FACT AX,RESULT AH,4 CH 21

START: MOV MOV CALL MOV INT AX,DATA DS,AX AX,N FACT AX,RESULT AH,4 CH 21 H 57

FACT L 1: EXIT: FACT CODE PROC CMP JNE MOV JMP PUSH DEC CALL

FACT L 1: EXIT: FACT CODE PROC CMP JNE MOV JMP PUSH DEC CALL POP MOV RET ENDP ENDS END AX,0 L 1 RESULT,1 EXIT AX AX FACT AX RESULT,AX START 58

【例4. 17】用模块化程序设计方法建立两个模块 MOD 1 ASM和MOD 2 ASM的数据通讯。 NAME MOD 1 EXTRN DISP:FAR PUBLIC STR

【例4. 17】用模块化程序设计方法建立两个模块 MOD 1 ASM和MOD 2 ASM的数据通讯。 NAME MOD 1 EXTRN DISP:FAR PUBLIC STR 1,N ,BUF DATA 1 SEGMENT STR 1 DB ‘HOW DO YOU DO? ’ N = $-STR 1 BUF DB ‘THIS IS AN EXAMPLE OF MODULES PROGRAM $′ DATA ENDS 60

STACK SEGMENT STACK DB 200 DUP(0) STACK ENDS CODE 1 SEGMENT ASSUME CS:CODE 1,DS:DATA

STACK SEGMENT STACK DB 200 DUP(0) STACK ENDS CODE 1 SEGMENT ASSUME CS:CODE 1,DS:DATA 1,SS: STACK START: MOV AX,DATA MOV DS,AX CALL DISP MOV AH,4 CH INT 21 H CODE 1 ENDS 61 END START

NAME EXTRN MOD 2 STR 1:BYTE,STR 2:BYTE,N: ABS PUBLIC DISP DATA 2 SEGMENT STR

NAME EXTRN MOD 2 STR 1:BYTE,STR 2:BYTE,N: ABS PUBLIC DISP DATA 2 SEGMENT STR 2 DB 81 DUP(0) DATA 2 ENDS CODE 2 SEGMENT ASSUME CS:CODE 2,ES:DATA 2 DISP PROC FAR MOV AX,DATA 2 MOV ES,AX 62

NEXT: DISP CODE 2 LEA BX,STR 1 MOV CX,N LEA SI,STR 2 MOV AL,[BX]

NEXT: DISP CODE 2 LEA BX,STR 1 MOV CX,N LEA SI,STR 2 MOV AL,[BX] MOV ES:[SI],AL INC BX INC SI LOOP NEXT LEA DX,BUF MOV AH,9 INT 21 H RET ENDP ENDS 63

方法二: 方法二 ADD AL, 90 H DAA ADC AL, 40 H DAA 方法三: 方法三

方法二: 方法二 ADD AL, 90 H DAA ADC AL, 40 H DAA 方法三: 方法三 CMP AL, 10 JB S ADD AL, 7 S: ADD AL, 30 H 67

第二次输入 2 ax=0002, bx=1 xchg, ax=1, bx=0002 mul cx, 后 ax=1× 10 add bx,

第二次输入 2 ax=0002, bx=1 xchg, ax=1, bx=0002 mul cx, 后 ax=1× 10 add bx, ax 后 bx=1× 10+2 xchg ax, bx; ax=12, bx=1× 10 第三次输入 3 ax=1× 10, bx=1× 10+2 83

②调回车换行 mov dl, 0 dh mov ah, 2 ret 21 h mov dl, 0

②调回车换行 mov dl, 0 dh mov ah, 2 ret 21 h mov dl, 0 ah mov ah, 2 ret 21 h ret 84

③二进制转为十六进制数, 并显示 和放在bx中 例123=64+32+16+(1011)B =01111011=7 BH bx=0000 0111, 1011 0000 rotate: mov cl, 4;

③二进制转为十六进制数, 并显示 和放在bx中 例123=64+32+16+(1011)B =01111011=7 BH bx=0000 0111, 1011 0000 rotate: mov cl, 4; rol bx, cl; rol ; 右移 4位后, 取低8位中低4位(与0 FH) add al, 30 h (bl) cmp al, 3 ah jl printit; 小于9, 是 0 -9数字 add al, 07 h printit: mov dl, al mov ah, 2 int 21 h dec ch → ch存放 4次循环 jne rotate 85