高手帮忙写一个简单的汇编语言程序【在线等】
发布网友
发布时间:2022-05-15 19:52
我来回答
共3个回答
热心网友
时间:2023-08-11 20:15
DATA SEGMENT
K DB 0D9H,07H,8BH,0C5H,0EBH,04H,9DH,0F9H,1H,2H,0CH,3H,0BH,4H,5H,6H,7H,9H,8H,0AH
DATA ENDS ;数据段
CODE SEGMENT
ASSUME CS:CODE, DS:DATA
START: MOV AX, DATA
MOV DS, AX
LEA SI, K ;源地址
MOV CX,20
MOV BH, [SI] ;最大最小都初始化为第一个数
MOV BL, BH
INC SI
A1: LODSB
CMP AL, BH ;比较第二和第二个以后的数
JLE A2 ;小于等于的话跳到A2
MOV BH, AL ;大于的话更新最大值
JMP A3
A2: CMP AL, BL ;和目前最小值比较
JGE A3 ;高的话跳到A3
MOV BL, AL ;更新最小值
A3: LOOP A1 ;循环
CALL DISP
MOV BL,BH
CALL DISP
MOV AX, 4C00H
INT 21H
DISP PROC NEAR
mov ch,2
rotate:
mov cl,4
rol bl,cl
mov al,bl
and al,0fh
add al,30h
cmp al,3ah
jl printit
add al,7h
printit:
mov dl,al
mov ah,2
int 21h
dec ch
jnz rotate
RET
DISP ENDP
CODE ENDS
END START
热心网友
时间:2023-08-11 20:15
; 本程序通过编译,运行正确。
Code Segment
Assume CS:Code,DS:Code
; -----------------------------------------
; 功能:显示指定地址(Str_Addr)的字符串
; 入口:
; Str_Addr=字符串地址(要求在数据段)
; 用法: Output Str_Addr
; 用法举例:Output PromptStr
Output MACRO Str_Addr
lea dx,Str_Addr
mov ah,9
int 21h
EndM
; -----------------------------------------
; 功能:输出回车换行
enter_CTLF proc Near
push ax
push dx
mov ah,02h
mov dl,0dh
int 21h
mov dl,0ah
int 21h
pop dx
pop ax
ret
enter_CTLF endp
; -----------------------------------------
; 功能:把AX中的二进制有、无符号数转换成显式的十进制ASCII码,并送显示屏显示
; 入口:AX=二进制数
; Signed=是否有符号数。'y'=有符号数,'n'=无符号数
; 出口:在当前光标位置显示转换后的ASCII码数字
Dec_ASCII Proc Near
push dx
push bx
push di
.IF Signed == 'y'
mov @@Carry_Yes,'+'
test ax,8000h
jz $+9
mov @@Carry_Yes,'-'
neg ax
.Endif
mov bx,10
lea di,@@Temp_Save[6]
mov byte ptr [di],'$'
dec di
cld
@@Divide: xor dx,dx
div bx
or dl,30h
mov [di],dl
dec di
test ax,0ffffh
jnz @@Divide
.IF Signed == 'y'
cmp @@Carry_Yes,'-'
jnz $+6
mov byte ptr [di],'-'
dec di
.Endif
inc di
push di
pop dx
mov ah,9
int 21h
pop di
pop bx
pop dx
ret
@@Temp_Save db 7 p(?)
@@Carry_Yes db '+'
Dec_ASCII EndP
; -----------------------------------------
Signed db 'y' ;是否有符号数。'y'=有符号数,'n'=无符号数
K db 12,26,87,253,198,113,99,75,61,51,-31,69,15,-63,-89,58,79,87,41,123
Count equ $-K ;数组元素个数
prompt_Max db 'the Maximum: $'
prompt_Min db 'the Minimum: $'
Start: push cs
pop ds
push cs
pop es ;使数据段、附加段与代码段同段
; 找出其中的最大值及最小值
cld
lea si,K ;数组变量地址
lodsb ;将第一个元素读入AL
mov ah,al ;AH=最大值,AL=最小值
mov cx,Count-1
Compare: cmp al,[si] ;当前最小值与当前元素比较
jle $+4 ;若小于或等于,不更新最小值,转去与最大值比较
mov al,[si] ;当前最小值大于当前元素,装入新的最小值
cmp ah,[si] ;当前最大值与当前元素比较
jge $+4 ;若大于或等于,不更新最大值
mov ah,[si] ;当前最大值小于当前元素,装入新的最大值
inc si ;增1,准备处理下一个字母
loop Compare
xchg ah,al
push ax
Output prompt_Max ;提示显示最大数
pop ax
push ax
cbw
call Dec_ASCII ;显示最大数
call enter_CTLF ;输出一个回车、换行
Output prompt_Min ;提示显示最小数
pop ax
xchg ah,al
cbw
call Dec_ASCII ;显示最小数
Exit_Proc: mov ah,4ch ;结束程序
int 21h
Code ENDS
END Start ;编译到此结束
热心网友
时间:2023-08-11 20:16
DATA SEGMENT
NUMA DB 0D9H,07H,8BH,0C5H,0EBH,04H,9DH,0F9H
NUMB DB ?,?
Max db 'Min: '
X db '00H',0dh,0ah
Min db 'Max: '
Y db '00H$'
DATA ENDS ;数据段
CODE SEGMENT
ASSUME CS:CODE, DS:DATA
START: MOV AX, DATA
MOV DS, AX
LEA SI, NUMA ;源地址
LEA DI, NUMB ;目标地址
MOV CX, 7
MOV BH, [SI] ;最大最小都初始化为第一个数
MOV BL, BH
INC SI
A1: LODSB
CMP AL, BH ;比较第二和第二个以后的数
JBE A2 ;小于等于的话跳到A2
MOV BH, AL ;大于的话更新最大值
JMP A3
A2: CMP AL, BL ;和目前最小值比较
JAE A3 ;高的话跳到A3
MOV BL, AL ;更新最小值
A3: LOOP A1 ;循环
MOV [DI], BX ; 把最大最小放到目标数据区
lea di,X
mov al,NUMB
call BintoHex;转换
lea di,Y
mov al,NUMB+1
call BintoHex
lea dx,Max;显示输出
mov ah,9
int 21h
mov ah,0
int 16h
MOV AX, 4C00H
INT 21H
BintoHex:
mov ah,al
mov cl,4
shr al,cl
and al,0fh
or al,'0'
cmp al,'9'
jbe Q1
add al,7
Q1:mov [di],al
inc di
mov al,ah
and al,0fh
or al,'0'
cmp al,'9'
jbe Q2
add al,7
Q2:mov [di],al
ret
CODE ENDS
END START