汇编语言程序设计题求高手

2024-11-14 12:23:25
推荐回答(3个)
回答1:

1.编写一个程序实现:在BUF开始的存储区中存放30个带符号数,试统计其正数、负数和零的个数,并将统计的个数分别放到PLUS、NEGATIVE、ZERO单元中。

; 本程序通过编译,运行正确
Code Segment
Assume CS:Code,DS:Code
BUF db 23,-69,0,35,46,0,57,68,0,79,81,98,-43,251,21,15,-69,0,58,159,-27,-89,65,76,85,123,0,253,193,121
Elements equ ($-BUF)/Type BUF ;元素个数
Plus db 0 ;正数计数
Negative db 0 ;负数计数
Zero db 0 ;零计数
Start: push cs
pop ds
push cs
pop es ;使数据段、附加段与代码段同段
cld
lea si,BUF ;取数据地址
mov cx,Elements ;元素个数
Statics: cmp byte ptr [si],0 ;是否0?
jnz $+8 ;不是
inc Zero ;是,0计数
jmp Next_One
test byte ptr [si],80h ;是否正数?
jnz $+8 ;不是
inc Plus ;是,正数计数
jmp $+6
inc Negative ;负数计数
Next_One:inc si ;si增1,判断下一个元素
loop Statics
Exit_Proc: mov ah,4ch ;结束程序
int 21h
Code ENDS
END Start ;编译到此结束

2.若内存BUF开始的单元中存放10个无序的有符号数,试用冒泡法将它们升序排列。
; 冒泡法排序
Code Segment
Assume CS:Code,DS:Code
; -----------------------------------------
; 定义常量
Yes EQU 1
No EQU 0
On EQU 1
Off EQU 0
; -----------------------------------------
; 定义结构类型
Bubb_Para Struc ; 冒泡排序法参数表
Carry DB No ; 是否带符号。Yes:有符号数;No:无符号数
Sort DB No ; 升序/降序。Yes:升序;No:降序
Yes_No DB 73h,76h,7dh,7eh
Load DB 0ach,0adh
Comp DB 3ah,3bh
Exchange DB 86h,87h
Store DB 0aah,0abh
Bubb_Para EndS
; -----------------------------------------
; 功能:按要求对数组元素排序,能够对字节元素、字元素进行无符号数、有符号数的升序、降序排序。
; 子程序原型:对字节元素进行无符号升序排序。
Bubbling Proc Near
PUSH AX
PUSH BX
PUSH CX
PUSH SI
PUSH DI
; ------------------根据排序参数,修改排序指令
LEA SI,Parameters
LEA DI,@@Compare
MOV AL,TYPE BUF
DEC AL
PUSH AX
LEA BX,[SI.Load]
XLAT
MOV [DI][2],AL
POP AX
PUSH AX
LEA BX,[SI.Comp]
XLAT
MOV [DI][3],AL
POP AX
PUSH AX
LEA BX,[SI.Exchange]
XLAT
MOV [DI][7],AL
POP AX
LEA BX,[SI.Store]
XLAT
MOV [DI][9],AL
MOV AL,[SI.Carry]
SHL AL,1
OR AL,[SI.Sort]
XOR AH,AH
LEA BX,[SI.Yes_No]
XLAT
MOV [DI][5],AL
; ------------------按要求排序
MOV CX,Elements ;外循环次数
@@Scanning: PUSH CX ;入栈保存外循环次数
LEA SI,BUF ;数组首地址装入源变址寄存器
@@Compare: PUSH SI
POP DI ;当前数组元素地址赋给目的变址寄存器,以备交换之用
LODSB ;将当前数组元素读入累加器
CMP AL,[SI] ;当前数组元素与相邻的下一个数组元素相比较
JBE @@NextOne ;若小于或等于,不作数据交换,处理下一个数组元素
XCHG AL,[SI] ;若大于,交换数组元素
STOSB ;保存数值较小者
@@NextOne: LOOP @@Compare ;处理下一个数组元素
POP CX ;外循环次数出栈
LOOP @@Scanning ;下一趟比较
; ------------------
POP DI
POP SI
POP CX
POP BX
POP AX
RET
Bubbling EndP
BUF DB -112,56,72,98,32,251,97,63,123,21 ;需要排序的数据
Elements EQU ($-BUF)/Type BUF-1 ; 外循环次数
Parameters Bubb_Para
Start: push cs
pop ds
push cs
pop es ;使数据段、附加段与代码段同段
call Bubbling ;对BUF中的元素按无符号数、升序排序
Exit_Proc: mov ah,4ch ;结束程序
int 21h
Code ENDS
END Start ;编译到此结束

回答2:

1.AX=1F3FH,BX=0204H,CX=1D3BH
2.AL=30(或者1EH),BL=10(或者0AH)
3.count=8
(我怀疑A1的定义里面是不是多了一个“,”。如果去掉那个逗号,则count=7)
表示A1中数据的个数
4.CF=1,SF=0,ZF=1,OF=0

回答3:

STACK
SEGMENT
STACK
DB
200
DUP(0)
STACK
ENDS
DATA
SEGMENT
STR1
DB
80
DB
0
DB
80
DUP(0)
DB
'$'
STR2
DB
81
DUP(0)
INPUT
DB
0
COUNT
DB
0
COUNT0
DB
0
COUNT1
DB
0
COUNT2
DB
0
ASK1
DB
0AH,0DH,"Please
input
a
string:
$"
ANSW0
DB
0AH,0DH,"String
length:
$"
ANSW1
DB
0AH,0DH,"Number
:
$"
ANSW2
DB
0AH,0DH,"Wode
:
$"
ANSW3
DB
0AH,0DH,"Arranged
string:
$"
RESULT1
DB
0AH,0DH,"Password
Right!$"
RESULT2
DB
0AH,0DH,"Password
Error!$"
MESSAGE
DB
0AH,0DH,"Press
any
key
to
continue!$"
DATA
ENDS
CODE
SEGMENT
ASSUME
ES:DATA,DS:DATA
ASSUME
SS:STACK,CS:CODE
START:
MOV
AX,DATA
MOV
DS,AX
MOV
ES,AX
LEA
DX,ASK1
MOV
AH,9
INT
21H
LEA
DX,STR1
;count
the
number
and
the
word
MOV
AH,10
INT
21H
MOV
BL,STR1+1
MOV
COUNT,BL
LEA
DI,STR1
CALL
COUNT_NUM
LEA
DX,ANSW0
;print
the
string
length
MOV
AH,9
INT
21H
XOR
DX,DX
MOV
DL,COUNT
CALL
PRINT_NUM
LEA
DX,ANSW1
;print
the
number's
count
MOV
AH,9
INT
21H
XOR
DX,DX
MOV
DL,COUNT1
CALL
PRINT_NUM
LEA
DX,ANSW2
;print
the
word's
count
MOV
AH,9
INT
21H
XOR
DX,DX
MOV
DL,COUNT2
CALL
PRINT_NUM
LEA
DI,STR1+2
CALL
TRUN_SET
;take
out
the
'
'
LEA
DX,ANSW3
MOV
AH,9
INT
21H
LEA
DI,STR1+2
CALL
PRINT_STRING
LEA
DX,ASK1
;input
the
word
and
change
to
'*',but
can't
del
MOV
AH,9
INT
21H
LEA
DI,STR2
CALL
INPUT_PASS
XOR
CX,CX
;compare
two
string
MOV
CL,COUNT
INC
CX
CMP
CL,COUNT0
JNE
NEXT0
LEA
SI,STR1+2
LEA
DI,STR2
CLD
REPZ
CMPSB
JNE
NEXT0
LEA
DX,RESULT1
MOV
AH,9
INT
21H
JMP
EXIT
NEXT0:
LEA
DX,RESULT2
MOV
AH,9
INT
21H
EXIT:
LEA
DX,MESSAGE
MOV
AH,9
INT
21H
MOV
AH,8
INT
21H
MOV
AH,4CH
INT
21H
;all
the
function.
INPUT_PASS
PROC
LOOP0:
MOV
AH,8
INT
21H
CMP
AL,0DH
JE
EXIT0
MOV
BYTE
PTR
[DI],AL
INC
DI
INC
COUNT0
MOV
DL,2AH
MOV
AH,2
INT
21H
JMP
LOOP0
EXIT0:
MOV
BYTE
PTR
[DI],'$'
RET
INPUT_PASS
ENDP
COUNT_NUM
PROC
INC
DI
LOOP1:
INC
DI
MOV
AH,BYTE
PTR
[DI]
CMP
AH,0DH
JE
EXIT1
CMP
AH,30H
JB
NEXT1
CMP
AH,39H
JA
NEXT1
INC
COUNT1
JMP
LOOP1
NEXT1:
CMP
AH,41H
JB
LOOP1
CMP
AH,5AH
JA
NEXT2
INC
COUNT2
JMP
LOOP1
NEXT2:
CMP
AH,61H
JB
LOOP1
CMP
AH,7AH
JA
LOOP1
INC
COUNT2
JMP
LOOP1
EXIT1:
RET
COUNT_NUM
ENDP
PRINT_NUM
PROC
MOV
AX,DX
MOV
CL,0AH
DIV
CL
XOR
DX,DX
MOV
DL,AL
ADD
AH,30H
XOR
BX,BX
MOV
BL,AH
PUSH
BX
CMP
AL,0
JE
EXIT2
CALL
PRINT_NUM
EXIT2:
POP
AX
MOV
DL,AL
MOV
AH,2
INT
21H
RET
PRINT_NUM
ENDP
TRUN_SET
PROC
MOV
BX,0
LOOP2:
CMP
BL,COUNT
JAE
NEXT5
CMP
BYTE
PTR[DI+BX],'
'
JE
NEXT3
INC
BX
JMP
LOOP2
NEXT3:
MOV
CX,BX
LOOP3:
CMP
BL,COUNT
JB
NEXT4
MOV
BX,CX
DEC
COUNT
JMP
LOOP2
NEXT4:
MOV
AL,BYTE
PTR[DI+BX+1]
MOV
BYTE
PTR[DI+BX],AL
INC
BX
JMP
LOOP3
NEXT5:
MOV
AL,BYTE
PTR[DI+BX]
CMP
AL,'
'
JNE
EXIT3
DEC
BX
JMP
NEXT5
EXIT3:
MOV
BYTE
PTR[DI+BX],'$'
MOV
COUNT,BL
DEC
COUNT
RET
TRUN_SET
ENDP
PRINT_STRING
PROC
XOR
BX,BX
MOV
BL,COUNT
LOOP4:
CMP
BL,0
JE
EXIT4
MOV
DL,BYTE
PTR[DI+BX]
MOV
AH,2
INT
21H
DEC
BX
JMP
LOOP4
EXIT4:
MOV
DL,BYTE
PTR[DI+BX]
MOV
AH,2
INT
21H
RET
PRINT_STRING
ENDP
CODE
ENDS
END
START