1.编程题: 设VARY中有一组8位的符号数,编程统计其中 正数、负数、零的个数,分别存 VM、VN、VK变量中。
具体程序:
stack segment para stack
dw 20H dup(0)
stack ends
data segment
vary db 23h,78h,56h,0abh,00h,0cdh,59h,14h,98h,0efh,00h,0c0h
cnt equ $-vary
vm db ?
vn db ?
vk db ?
data ends
code segment
assume cs:code,ds:data,ss:stack
start: mov ax,data
mov ds,ax
mov bx,0
mov dl,0
lea si,vary
mov cx,cnt
lop1:
cmp byte ptr[si],0
je zero
js lop2
inc bh
jmp next
lop2:
inc bl
jmp next
zero:
inc dl
next:
inc si
loop lop1
mov vm,bh
mov vn,bl
mov vk,dl
mov ah,4ch
int 21h
code ends
end start
2.编程题: 判断方程AX2+BX+C=0是否有实根。若有实根,则将字节变量TAG置1,否则置0。假设A、B、C均为字节变量,数据范围为-128~127。
具体程序:
Data segment
A db 7
B db 8
C db 6
Tag db ?
Data ends
Code segment
Assume ds:data,cs:code
Start:
Mov ax,data
Mov ds,ax
Mov al,b
Imul al;乘法指令,求出B2的值并放入AX中
Mov bx,ax
Mov al,a
Imul c
Mov cx,4
Imul cx
Cmp bx,ax
Jge yes
Mov tag ,0
Jmp done
Yes: mov tag,1
Done: mov ah,4ch
Int 21h
Code Ends
End start
3.编程题: 设在数据段中定义有三个变量X,Y,Z,其中X的值为8,Y的值为9,请利用算术移位指令编写程序,计算出下式的值(假设乘积的结果只有低16位有效)。
具体程序为:
DATA SEGMENT
X DW 8
Y DW 9
Z DW ?
DATA ENDS
ASSUME CS:CODE,DS:DATA
CODE SEGMENT
START:
MOV AX,DATA
MOV DS,AX
MOV AX,X
MOV BX,Y
ADD AX,BX ;X+Y
SHL AX,1 ;(X+Y)*2
MOV BX,AX
MOV CL,2
SHL AX,CL
ADC AX,BX
MOV Z,AX
CODE ENDS
END START
4.编程题:编程实现: S=1+2+3+……+100 ,要求计算后的结果存放在变量S里。
具体程序为:
DATA SEGMENT
S DW (?)
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START:
MOV AX,DATA
MOV DS,AX
MOV CX,100
MOV AX,0H
MOV BX,1H
LOOP1:
ADD AX,BX
INC BX
LOOP LOOP1
MOV S,AX
MOV AH,4CH
INT 21H
CODE ENDS
END START
5.编程题:已知有两个双字长度的数DATA1和DATA2,要求用8086汇编语言编程实现两数相加,并将结果存放在result中,采用高地址优先存储结果(如1234H,5678H表示56781234H)。程序的数据段部分已给出,要求补充完整程序,实现上述要求的功能。
具体程序设计
DATA SEGMENT
DATA1 DW 5311H,8A13H ;表示数据8A135311H
DATA2 DW 4783H,9526H ;表示数据95264783H
RESULT DW 2 DUP(?) ; 存放多字节加法的结果
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START:
MOV AX,DATA
MOV DS,AX
MOV AX,DATA1
MOV DX,DATA1+2
ADD AX,DATA2 ;低字部分相加
ADC DX,DATA2+2 ;高字部分带进位相加
MOV RESULT,AX ;存放低字部分相加结果
MOV RESULT+2,DX ;存放高字部分相加结果
CODE ENDS
END START