12,34,56,-12,-34,-9,0,3,0,-5,3,5
0AH,0FFH,4,0,77H,88H,0F0H,0BBH
;存正数累加和
;存负数绝对值累加和
;存正数数据个数
;存负数数据个数
PARA
STACK
DATA
ARRAY
SEGMENT
DB
DB
EQU $-ARRAY
COUNT
DW 0
SUM1
SUM2
DW 0
CUNT1 DB 0
CUNT2 DB 0
ENDS
DATA
STACK1
SEGMENT
STA DW 20H DUP(0)
STACK1
COSEG SEGMENT
ENDS
ASSUME CS:COSEG,DS:DATA,SS:STACK1
START: MOV
AX,DATA
DS,AX
MOV
XOR AX,AX
XOR BX,BX
XOR CX,CX
XOR DX,DX
LEA SI,ARRAY
MOV
CL,COUNT
LOP: TESTBYTE PTR [SI],80H
JE
PLUS
MOV
NEG CH
ADD
ADC
INC
JMP NEXT
ADD
ADC AH,0
INC
INC SI
PLUS:
NEXT:
CH,[SI]
; 求负数绝对值
BL,CH
BH,0
DL
; 负数绝对值累加
; 个数计数
AL,[SI]
; 正数累加
DH
; 个数计数
; 存结果
SUM1,AX
SUM2,BX
CUNT1,DH
CUNT2,DL
AH,4CH
DEC CL
JNE LOP
MOV
MOV
MOV
MOV
MOV
INT 21H
COSEG ENDS
END START
2、上机题目:两个八位数的相加运算
内容: DAT 开始的单元中存放两个八位二进制数,两个数相加后结果存入 SUM 单元中。( SUM 为十六位 )
DAT DB X1,X2
SUM DW ?
无符号数
有符号数
data segment
dat db 0feh,05h
sum dw ?
data ends
code segment
assume cs:code,ds:data
start:mov ax,data
mov ds,ax
mov al,dat
xor ah,ah
add al,dat+1
adc ah,0
mov sum,ax
code ends
end start
1、上机题目:统计正数(负数)的个数
内容:DAT 开始的单元中存放 N 个字节有符号数,
统计正数的个数存入 T0 单元中;负数的个数存入 T1 单元
中;
Dat DB
DB
T0
T1
DB
X1,……,XN
?
?
equ $-dat
data segment
dat db 12,23,-45,-82,91,64,0,-2,4,37
count
t0 db ?
t1 db ?
data ends
codesegment
assume cs:code,ds:data
start:
mov ax,data
mov ds,ax
mov cx,count
mov si,0
data segment
dat db 0feh,05h
sum dw ?
data ends
code segment
assume cs:code,ds:data
start:mov ax,data
mov ds,ax
mov al,dat
cbw
mov bx,ax
mov al,dat+1
cbw
add ax,bx
mov sum,ax
code ends
end start
lop: test dat[si],80h
t1
t0
; 个数计数
; 个数计数
je
plus
inc
jmp next
inc
inc si
plus:
next:
dec cx
cmp cx,0
jne lop
mov ah,4ch
int 21h
codeends
end start
2、上机题目:无符号数排序
内容:TAB 开始的单元中存放 N 个字节无符号数,请按照从大到小排序后,存入 DAB 单元中。(选作:从小到大
排序)
TAB DB
DAB DB
X1,……,XN
N DUP(?)
data segment
tab db 01h,10h,05h,60h,30h,11h
n equ $-tab
dab db n dup(?)
data ends
code segment
assume cs:code,ds:data
start:
mov ax,data
mov ds,ax
mov bx,0
mov cx,n
q:mov al,tab[bx]
mov dab[bx],al
inc bx
loop q
mov cx,n
dec cx
lop:
mov di,cx
mov bx,0
lop1: mov al,dab[bx]
cmp al,dab[bx+1]
jnb next
xchg al,dab[bx+1]
mov dab[bx],al
next: inc bx
dec cx
cmp cx,0
jnz lop1
mov cx,di
dec cx
cmp cx,0
jnz lop
mov ah,4ch
int 21h
code ends
end start
1、上机题目: 求最大数(最小数)
内容:DAT 开始的字单元中存放 N 个无符号数,求出最
大数存入 MAX 单元中。
( 求出最小数存入 MIN 单元中 )
DAT DW X1,……,XN
MAX DW ?
MIN DW ?
data segment
dat dw 6,2,3,1,5,4,2
count equ ($-dat)/2
max dw ?
min dw ?
data ends
code segment
assume cs:code,ds:data
start: mov ax,data
mov ds,ax
mov cx,count-1
mov si,0
mov ax,dat[si]
mov bx,dat[si]
j0: add si,2
cmp ax,dat[si]
jnb j1
mov ax,dat[si]
j1: cmp dat[si],bx
jnb j2
mov bx,dat[si]
j2:
loop j0
mov max,ax
mov min,bx
mov ah,4ch
int 21h
code ends
end start
2、上机题目:数据查找 内容:TABLE 开始的字节单元中
存放 N 个无符号数,dt 单元存放一个已知数据 X,现从
TABLE 中查找是否存在数据 X,如果存在,NO 单元存放
该数据在 TALBE 中的序号,否则 NO 单元存放 FFH 。
TABLE DB
dt
no
DB
DB
X1,……,XN
x
?
data segment
table db 55h,01h,60h,12h,22h
count equ $-table
dat db 0h
no db ?
data ends
code segment
assume cs:code,ds:data
start: mov ax,data
mov ds,ax
mov cx,count
mov si,0
mov al,dat
lop: cmp table[si],al
jz j0
inc si
loop lop
1、上机题目:代码转换
j0: cmp cx,0
jnz next
mov al,0ffh
mov no,al
jmp done
next: mov ax,si
mov no,al
jmp done
done: mov ah,4ch
int 21h
codeends
end start
内容:用子程序设计的方法,分别把 BUF 字单元中的四个十六进制数转换为 ASCII 代码存入 MAS 开始的单元中,
BUF DW X
MAS DB 4 DUP(?)
并在 crt 上显示。
data segment
buf dw 21ACh
mas db 4
dup(?)
data ends
codesegment
assume cs:code,ds:data
main
proc near
mov ax,data
mov ds,ax
call decbin
mov ah,4ch
int 21h
endp
proc near
main
decbin
pushdx
mov si,0
mov ch,4h
lop: mov cl,4h
mov ax,buf
rol ax,cl
mov buf,ax
and ax,0fh
cmp al,0ah
jb
yes
add al,7
yes: add al,30h
mov mas[si],al
mov dl,al
mov ah,2
int 21h
inc si
dec ch
cmp ch,0
jnz
lop
pop dx
ret
decbin
endp
codeends
end main
做法 A
data
segment
buf db 100
db ?
db 100 dup(?)
data
code
ends
segment
assume ds:data,cs:code
far
main proc
call ascii
mov ax,4ch
int 21h
main endp
ascii proc near
mov ax,data
mov ds,ax
mov si,offset buf
mov dx,offset buf
mov ah,0ah
int 21h
call crlf
inc si
mov cl, [si]
mov ch,0
inc si
agn: mov bl,[si]
mov dl,[si]
shr dl,1
shr dl,1
shr dl,1
shr dl,1
add dl,30h
mov ah,2
int 21h
and bl,0fh
add bl,30h
cmp bl,39h
jl shore
add bl,7
shore: mov dl,bl
mov ah,2
int 21h
call crlf
inc si
loop agn
ret
ascii endp
crlf proc near
mov dl,0dh
mov ah,2
int 21h
mov dl,0ah
mov ah,2
int 21h
ret
crlf endp
code
ends
end main
main proc far
mov ax,data
mov ds,ax
call decbin
call crlf
call binihex
call crlf
mov ah,4ch
int 21h
main endp
decbin proc near
lea dx,buf
mov ah,10
int 21h
ret
decbin endp
binihex proc near
push dx
xor ax,ax
xor cx,cx
mov si,0
mov bl,buf+1
lop1:
print:
mov ch,02h
mov cl,04h
mov al,buf[si+2]
mov ah,2h
int 21h
dec ch
cmp ch,0h
jnz print
call crlf
inc si
cmp si,bx
js
lop1
pop dx
ret
binihex endp
crlf proc near
mov dl,0dh
mov ah,2
int 21h
mov dl,0ah
mov ah,2
int 21h
ret
crlf endp
code ends
end main
mov ax,ms
call show
mov ah,4ch
int 21h
main endp
2、上机题目:键盘输入
内容:用子程序设计的方法,要求从键盘输入一串字母,在 CRT 上依次显示该串字母的 ASCII 代码。
做法 B
data segment
buf db 100
db ?
db 100 dup(?)
data ends
code segment
rol al,cl
mov buf[si+2],al
and ax,0fh
cmp al,0ah
js next
add al,07h
assume cs:code,ds:data
next:
add al,30h
mov dl,al
1、上机题目:将 DAT 数组的 N 个无符号数分成两个数组,偶数数组 P 和奇数数组 M,统计并在 CRT 上显示两个数
组数据个数。
data segment
P
main proc far
DAT DW X1,……,XN
DW n dup (?)
M
DW n dup (?)
dat dw 0021h,0001h,000ah,0003h,0004h,000bh
n equ ($-dat)/2
p dw n dup (?)
m dw n dup (?)
ps dw ?
ms dw ?
mov ax,data
mov ds,ax
call lookfor
mov ax,ps
call show
call clrf
data ends
code segment
assume cs:code,ds:data
lookfor proc near
mov cx,n
mov si,0
mov al,0
mov bl,0
lop: test dat[si],1b
jnz next
mov bx,dat[si]
push si
mov si,ps
shl si,1
inc ps
mov p[si],bx
pop si
jmp j0
next:
mov bx,dat[si]
push si
mov si,ms
shl si,1
inc ms
mov m[si],bx
pop si
clrf proc near
mov dl,0dh
mov ah,02h
int 21h
mov dl,0ah
int 21h
ret
clrf endp
code ends
end main
j0:
add si,2
dec cx
cmp cx,0
jne lop
ret
lookfor endp
show proc near
xor bx,bx
xor cx,cx
mov bx,10
nx1: xor dx,dx
div bx
or dx,0e30h
inc cx
push dx
cmp ax,0
jnz nx1
nx2: pop ax
int 10h
loop nx2
ret
show endp
2、上机题目:从键盘上输入 2 个十进制数,存入 A、B 单元 中,C = A + B,并在 CRT 上 按十进制显示 C 值。
DB ?
B
DB ?
decibin proc near
mov bx,0
newchar:mov ah,1
int 21h
sub al,30h
cmp al,0
jl exit
cmp al,09
jg exit
xchg al,bl
mov cx,10d
mul cx
xchg al,bl
add bl,al
jmp newchar
exit:
ret
decibin endp
A
data segment
a db ?
b db ?
c dw ?
data ends
code segment
assume cs:code,ds:data
main proc far
mov ax,data
mov ds,ax
call decibin
mov a,bl
call clrf
call decibin
mov b,bl
call clrf
call addab
call show
mov ah,4ch
int 21h
main endp
nx2: pop ax
int 10h
loop nx2
ret
show endp
clrf proc near
mov dl,0dh
mov ah,02h
int 21h
mov dl,0ah
int 21h
ret
clrf endp
code ends
end main
C
DW ?
addab proc near
xor ax,ax
xor bx,bx
mov al,a
mov bx,ax
mov al,b
add ax,bx
mov c,ax
ret
addab endp
show proc near
xor bx,bx
xor cx,cx
mov bx,10
nx1: xor dx,dx
div bx
or dx,0e30h
inc cx
push dx
cmp ax,0
jnz nx1
3、上机题目:键盘输入
内容:用子程序设计的方法,要求从键盘输入 2 位 16 进制数,转化为 10 进制数并在 CRT 上显示。
lop4:dec si
data segment
ys proc near
mov cx,2
mov si,0
lop3:cmp mas[si],61h
;小写字母,将 ASCII 转换为
十六进制数,其实是二进制
;数字
jnb lop1
cmp mas[si],41h
;大写字母
jnb lop
sub mas[si],30h
jmp lop2
lop1:sub mas[si],57h
jmp lop2
lop: sub mas[si],37h
lop2:inc si
loop lop3
ret
endp
ys
put proc near
xor ax,ax
mov si,0
mov al,mas[si]
mov bl,16
mul bl
;AL 乘 16 放入 AX 中
inc si
add ax,word ptr mas[si]
mov bh,10
mov si,0
lop5:div bh
mov buf[si],ah
;ah 里面存余数,采用
除十取余思想,余数倒序即
为十进制数
inc si
test al,1
;测试商是否为零,为
零结束循环
jz lop4
mov ah,0
jmp lop5
mov cx,si
inc cx
mov ah,2
mov dl,0dh
int 21h
mov dl,0ah
int 21h
lop6:add buf[si],30h
mov dl,buf[si]
int 21h
dec si
loop lop6
ret
put endp
code ends
end go
mas db 2 dup(0)
buf db 4 dup(0)
data ends
code segment
assume cs:code,ds:data
go: mov ax,data
mov ds,ax
call get
call ys
call put
mov ah,4ch
int 21h
get proc near
mov si,0
mov ah,01
int 21h
mov mas[si],al
inc si
int 21h
mov mas[si],al
ret
get endp
buf1 db 'ABc5d6EfG','$'
ct equ $-buf1
buf2 db ct dup (?)
count db ?
data ends
code segment
assume
cs:code,ds:data
go:
mov ax,data
mov ds,ax
mov cx,ct
dec cx
mov count,0
mov si,0
3、题目:BUF1 中存入如下由大小写字符和数字字符构成的串,要求将其中的大写字符变小写,小写字符变成大写,
数字字符不变,并按序存入 BUF2 中,同时统计数字字符个数存入 COUNT 单元中,并用子程序在 CRT 上显示 COUNT
的内容。 BUF1
data segment
?
put proc near
DB ‘ABc5d6EfG’,'$'
COUNT DB
lop:cmp buf1[si],3Ah
;判断数字
BUF2
DB ‘-------------’
lop2:add buf1[si],20h
;加 20h,大写变小写
jb lop1
cmp buf1[si],5Bh
;判断大写
jb lop2
cmp buf1[si],7Bh
;判断小写
jb lop3
lop1:inc count
;数字不变,COUNT 加一统
计个数
jmp lop4
jmp lop4
lop3:sub buf1[si],20h
;减 20H,小写变大写
lop4:mov bl,buf1[si]
;buf1 到 buf2
mov buf2[si],bl
inc si
loop lop
mov buf2[si],'$'
call put
mov ah,4ch
int 21h
add count,30h
;题目定义知,数字个数小
于 9,不用十进制数出,直
接加 30H
mov ah,02
mov dl,count
int 21h
ret
put endp
code ends
end go
4、题目:DAT 开始的单元中存放 n 个字节的正负数和 0,求所有负数的绝对值和存入 SUM 单元中,并统计 0 的个
数,存入 ZCOUNT 单元,用子程序在 CRT 上显示 SUM 内容。DAT DB D1,……,Dn SUM DW? ZCOUNT DB ?
data segment
dat
db
2,4,0,5,8,2,0,6,-2,-5,-3,0,-5,-7,-3,0,-
6,0,7,4,2,7,-5,-3
equ $-dat
ct
zcount db 0
sum
c
db 0
db 3 dup(?)
jz lop2
jmp lop3
inc si
dec cx
jnz lop
jmp lop4
lop1:neg dat[si]
;负数绝对值,负变正需要求补
data ends
code segment
assume cs:code,ds:data
go:
mov ax,data
mov ds,ax
mov cx,ct
mov si,0
lop:test dat[si],80h ;测试正负
jnz lop1
test dat[si],0ffh ;测试零
xor ax,ax
add al,dat[si]
add sum,al
inc si
dec cx
jnz lop
jmp lop4
lop2: inc zcount
;零个数统计
lop3: inc si
dec cx
jnz lop
lop7:dec si
mov cx,si
inc cx
mov ah,2
lop6:add c[si],30h
mov dl,c[si]
int 21h
dec si
loop lop6
ret
put endp
code ends
end go
lop4:call put
; 调 用 十 进 制 输 出
子程序并输出
mov ah,4ch
int 21h
put proc near
xor ax,ax
mov al,sum
mov bh,10
mov si,0
lop5:div bh
mov c[si],ah
inc si
test al,1
jz lop7
mov ah,0
jmp lop5