高手帮忙写一个简单的汇编语言程序【在线等】

作者&投稿:芷惠 (联系方式在网页底部的电邮联系)
高手帮忙写一个汇编程序~~~

DATA SEGMENT
BLOCK DB 20 DUP(?)
C1 EQU $-BLOCK
COUNT DB ?
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START: MOV AX,DATA
MOV DS,AX
MOV CX,C1 ;长度
MOV BX,OFFSET BLOCK ;设首址
LOP: MOV AL,[BX]
TEST AL,80H
JZ LOP2
INC COUNT ;负数
LOP2: INC BX
LOOP LOP
MOV AH,4CH
INT 21H
CODE ENDS
END START

; 本程序通过编译,运行正确
Code Segment
Assume CS:Code,DS:Code
CR equ 000DH
LF equ 000AH
KB_Back equ 0008H
KB_ESC equ 001BH
; -----------------------------------------
; 功能:输出一个字符
; 入口:dl=要显示的字符
enter_Chr proc Near
push ax
mov ah,02h
int 21h
pop ax
ret
enter_Chr endp
; -----------------------------------------
; 功能:显示指定地址(Str_Addr)的字符串
; 入口:
; Str_Addr=字符串地址(要求在数据段)
; 用法: Output Str_Addr
; 用法举例:Output PromptStr
Output MACRO Str_Addr
lea dx,Str_Addr
mov ah,9
int 21h
EndM
; -----------------------------------------
; 功能:取光标位置
; 入口:无
; 出口:DH=行号,DL=列号
GetCursor Proc Near
PUSH AX
PUSH BX
PUSH CX
XOR BX,BX
MOV AH,3
INT 10H
MOV Cursor_Row,DH
MOV Cursor_Col,DL
POP CX
POP BX
POP AX
RET
Cursor_Row DB ?
Cursor_Col DB ?
GetCursor EndP
; -----------------------------------------
; 功能:置光标位置
; 入口:Cursor_Row=行坐标; Cursor_Col: 列坐标)
SetCursor Proc Near
PUSH CX
PUSH BX
PUSH AX
MOV DH,Cursor_Row
MOV DL,Cursor_Col
XOR BX,BX
MOV AH,2
INT 10H
POP AX
POP BX
POP CX
RET
SetCursor EndP
; -----------------------------------------
; 功能:输出回车换行
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
; -----------------------------------------
; 功能:键盘输入一个N位的十进制数字,
; 用逻辑和移位指令将其转换成二进制数并保存在指定的内存单元。
; 入口:N=数字位数;di=保存输入的数字首地址
; 出口:转换后的二进制数保存在di所指的单元
Input_Digit Proc Near
push dx
push cx
push bx
push di
lea di,@@Save_Tmp
push di
cld
mov cx,N
push cx
@@Input: call GetCursor ;取光标位置
mov ah,1 ;从键盘接受一个字符
int 21h
cmp al,KB_ESC
jnz $+12
mov Mark_Bit,al
pop cx
pop di
pop di
pop bx
pop cx
pop dx
ret
cmp al,CR ;若键入的是回车,已经键入的数字不足N位
jz @@ASC_Dec ;转去处理已经键入的数字
cmp al,KB_Back
jz @@KBBack ;若是回空键,重新输入
cmp al,'0'
jb @@KB_Back ;若低于数字'0',重新输入
cmp al,'9'
ja @@KB_Back ;若低于数字'9',重新输入
jmp @@Save_Dig
@@KBBack: dec Cursor_Col
inc cx
dec di
@@KB_Back: call SetCursor ;置光标位置
jmp @@Input
@@Save_Dig: and al,0fh ;转换成二进制数
stosb ;保存
loop @@Input ;接受下一个数字
@@ASC_Dec: mov ax,cx
pop cx
pop si
sub cx,ax ;实际输入的数字位数
xor dx,dx
xor ax,ax
jcxz @@Save_Ret ;若直接回车,没有输入任何数字,按输入'0'处理
dec cx ;实际输入的数字位数减1,准备把输入的这一串数字转换成二进制数
mov bx,10
@@Mul_Ten: lodsb
cbw
add ax,dx
mul bx
mov dx,ax
loop @@Mul_Ten
lodsb
cbw
add ax,dx
@@Save_Ret: pop di
stosw
pop bx
pop cx
pop dx
mov Mark_Bit,0
ret
@@Save_Tmp db 16 dup(?)
Input_Digit EndP
; -----------------------------------------
; 功能:将AL中的低4位二进制数转换成十六进制显示的ASCII码
; 入口:AL
; 出口:AL=转换后的ASCII码
AL_ASCII Proc Near
cmp al,10 ;AL<10?
jb @@To_ASCII ;AL<10,按数字处理
add al,7 ;AL>=10,按大写字母处理
@@To_ASCII: add al,'0' ;转换成相应的数字或大写字母
ret
AL_ASCII EndP
; -----------------------------------------
; 功能:将AL中的字节数转换成十六进制显示的ASCII码
; 入口:AL
; 出口:AX=转换后的ASCII码
Byte_ASCII Proc Near
push cx
mov cx,4
xor ah,ah ;将AH置0
shl ax,cl ;将AX左移4位
shr al,cl ;将AL右移4位
xchg ah,al
call AL_ASCII ;调用子程序,将AL中的值转换成相应的ASCII码
xchg ah,al
call AL_ASCII
xchg ah,al
pop cx
ret
Byte_ASCII EndP
; -----------------------------------------
N equ 5 ;数字位数
Number dw ? ;16位二进制数
PromptStr DB 'Please input a decimal(0---65535, ESC to exit): $'
Hex_String db 'The heximal: '
Hex_Str db ' H$'
Mark_Bit db ? ;标志字节
Disp_Ok db 'OK$'
Start: push cs
pop ds
push cs
pop es ;使数据段、附加段与代码段同段
Input_Dec: Output PromptStr ;提示输入十进制数
lea di,Number ;分数存放地址
call Input_Digit ;从键盘输入一个十进制数
cmp Mark_Bit,KB_ESC
je Exit_Proc
call enter_CTLF ;输出一个回车、换行
call enter_CTLF ;输出一个回车、换行
lea di,Hex_Str
mov ax,Number ;读出这个数
push ax
xchg ah,al ;先转换高位字节
call Byte_ASCII ;把8位二进制数转换成十六进制显示的ASCII码
stosw ;保存至字符串变量
pop ax
call Byte_ASCII ;把8位二进制数转换成十六进制显示的ASCII码
stosw
Output Hex_String ;显示十六进制数
call enter_CTLF ;输出一个回车、换行
call enter_CTLF ;输出一个回车、换行
jmp Input_Dec
Exit_Proc: call SetCursor ;置光标位置
Output Disp_Ok
mov ah,4ch ;结束程序
int 21h
Code ENDS
END Start ;编译到此结束

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

; 本程序通过编译,运行正确。
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 dup(?)
@@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 ;编译到此结束

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

相关视频

高手帮忙写一个简单的汇编语言程序【在线等】
输出一个回车、换行Output prompt_Min ;提示显示最小数pop axxchg ah,alcbwcall Dec_ASCII ;显示最小数Exit_Proc: mov ah,4ch ;结束程序int 21hCode ENDSEND Start ;编译到此结束DATA SEGMENTNUMA DB 0D9H,07H,8BH,0C5H,0EBH,04H,9DH,0F9HNUMB DB ?,

编写一段汇编程序,实现P1.0口输出周期为20ms的方波(用单片机定时器T1采用...
晶振频率选用 12MHz。如下程序即可:ORG 0000H MOV TMOD, #10H SETB TR1 LOOP:MOV TH1, ...

...各单元内容清零,单片机程序怎么写?高手的帮帮忙了
汇编程序如下:ORG 0000HLJMP STARTORG 0050HSTART:CLR EAMOV SP,#60HMOV R0,#20HMOV R1,#0LOOP:CLR AMOV @R0,AINC R0INC R1CJNE R1,#16,L_LOOPSJMPEND51程序如下:ORG 0000HLJMP STARTORG 0050HSTART:CLR EAMOV SP,#6FHMOV R0,#20HMOV R1,#16LOOP:MOV A,#0MOV @R0,AINC R0...

8051汇编实现寻找一个质数(素数)的所有分解因子
求高手帮忙用8051汇编写一个简单的寻找质数的所有因子,比如说12的所有因子是{2,2,3}因为 2x2x3=12。要求:1.需要做运算的质数在程序开始的时候会被存到R0,比方说MOV R0, xxxx;2.当运行完程序后,所有的因子会被储存到从0x70开始的内存地址中。3. 由于事先不知道一个质数到底会有多少个因子...

汇编题目,请高手帮忙
1、ARRAY是空间变量名,在语境下是数组的首地址,但是不是十四个字节,而是18个字节,9个字。DB定义字节,DW定义字(1字=2字节),DD定义双字。DW后的每一个十进制数都占用两个字节。2、ARYEND同ARRAY,也是空间变量名,在语境下是数组的首地址。?表示其空间内存放的是随机数。3、有一二可知,CX...

汇编高手帮帮忙,题目:输入一个十进制数(0-255)
dim x as integer,y as string,z as string,q as integer x=inputbox "请输入0-255的十进制数"if x = 0 then print 0,0000 else for i=1 to x for j = 2 to i-1 if i mod j = 0 then exit for next j if j=i then print i;do while i<>0 y=trim(str(i mod 2))...

超高分请教一道汇编语言编程问题
ADD DI,2;指向NUMBER的下一个字单元 POP CX;恢复原来的CX的值 LOOP INPUT;循环输入 ;接下来就是排序了 ;这里我们用冒泡排序,升序 ;冒泡排序的思想是:从第一个元素开始,依次对N个元素中相邻的两个元素进行比较 ;若顺序不满足则交换,经过一轮后,最大的元素就排到了最右边.后面依次类推 MOV CX,COUNT DEC CX MOV

汇编高手帮帮忙!急。。。正确的追加50分
int 1ah call xssj mov ah,4ch int 21h input_bcd:mov cl,4 call key shl al,cl mov dl,al call key add al,dl ret key:mov ah,0 int 16h cmp al,'0'jb key cmp al,'9'ja key mov ah,0eh int 10h sub al,'0'ret xssj:mov di,(80*10+30)*2 T1:mov ah,04 ;CX=...

4X4键盘的单片机汇编编程~急
L1: JB ACC.1,L2 MOV A,#04H LJMP LK L2: JB ACC.2,L3 MOV A,#08H LJMP LK L3: JB ACC.3,NEXT MOV A,#0CH LJMP LK NEXT: INC R4 MOV A,R2 JNB ACC.7,KEY RL A MOV R2,A LJMP K3 LK: ADD A,R4 MOV 88H,...