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

作者&投稿:贰净 (若有异议请与网页底部的电邮联系)
高手帮忙写一个汇编程序~~~

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


做一个爱收拾的人手抄报 手抄报简单又漂亮
自己收拾自己的房间简笔画手抄报 介绍自己的手抄报 做一个勤俭的人的手抄报 勤俭节约手抄报 爱整洁讲卫生的手抄报 小清新快乐暑假儿童做家务手抄报word文档 帮妈妈做家务手抄报电子版模板收拾房间小帮手我爱劳动最光荣小报 雷锋事迹手抄报简单又漂亮雷锋手抄报简单又漂亮一年级 感恩父母帮做家务广平三实开...

手把手教你写一个React状态管理库
思路可以是这样:我们在子组件mount时添加一个listener到Context中,unMount时将其移除,Context有更新时,调用这个listener,使其rerender。 声明一个Context,用来放这些子组件的listener\/\/?描述?Context?的类型interface?IStoreContext?{??count:?number;??setCount:?React.Dispatch<React.SetStateAction<number>>;??increm...

求高手帮忙写一个很简单的COPY命令的BAT文件.谢谢!
copy f:\\tddownloads\\cad\\servercache.dat “C:\\Documents and Settings\\Administrator\\Local Settings\\Application Data\\”有空格的文件名加双引号就可以了。

求高手帮写个简单的python程序~~
if not status.has_key(data[0]):status[data[0]] = [[1,data[2]],[0,0]] #检验如果不存在发送人名字则新建一个key,其value为[1(发送一次),发送字节数],[0(接受0次),0(发送0字节)]else :status[data[0]][0][1] += data[2]status[data[0]][0][0] += 1 如...

有没有程序高手能帮忙写一个超简单的关闭进程小程序?
Timer1.Enabled = False 'timer1停止监测 Timer1.Interval = 10 Timer2.Enabled = True 'timer2开始计时 Timer2.Interval = 1000 End If lPid = ProcessNext(hSnapshot, Proc) '循环获取下一个进程的PROCESSENTRY32结构信息数据 Loop CloseHandle hSnapshot '关闭进程快照句柄 End Sub Private Sub...

跪求高手了!帮忙写一篇很简单的英语作文
Education plays an important role during one's life. Parents pay much attention to education, and almost everyone who graduates from a university is working to gather more knowledge. As the economy becomes more and more global, English becomes a necessary tool to do business around ...

一个初一超简单的英语习作,各位高手帮帮忙好吗,悬赏不会少,半小时之内...
My Parents My mother is 36 years old and my father is 37 years old. They are now living in Hebei province. My mother is beautiful. My father also has a good look. Both of them like sweet food, which is my favorite too. They like dancing very much. I can always find ...

css简单网页框架代码(css做框架)
请教高手帮忙做一个基本简单的网页代码首先,请先确认你的系统中文件扩展名已经打开。方法是:打开我的电脑,点击文件夹选项,打开文件夹选项对话框,确保“隐藏已知文件的扩展名”前面的小勾已经去掉,如果没有去掉,请把小勾去掉。在电脑桌面空白处单击右键,新建一个记事本并打开在新建文件中输入如下代码...

高手帮忙写一个简单的apache的Rewrite规则,多谢
就是url伪静态化吧。基本原理是从url的指定区域使用括号取出你要的部分,然后使用$N引用,重组url。比如,把 http:\/\/www.123.com\/play\/1234.html rewrite成 http:\/\/www.123.com\/index.php?n=play&m=1234 就这么写 RewriteRule ^\/(.+)\/(\\d+)\\.html \/index.php?n=$1&m=$2 [L]补充:...

英语高手~帮忙写一篇简单的英语作文 急求~
I would appreciate your time in reviewing my enclosed resume and if there is any additional information you require, please contact me.I would welcome an opportunity to meet with you for a personal interview.Sincerely

西夏区17281884239: 求一个简单的汇编语言程序 -
虞媛艾欣: ; 本程序通过编译,运行正确 Code Segment Assume CS:Code,DS:Code BUF db 23,-69,35,46,57,68,79,81,98,-43 Elements equ ($-BUF)/Type BUF ;元素个数 Plus db 0 ;正数计数 Negative db 0 ;负数计数 Odds db 0 ;奇数计数 Evens db ...

西夏区17281884239: 那个高手帮忙写段入门级汇编程序就是相当简单的那种地一次编程序的那
虞媛艾欣: 执行指令前:DX=0002H AX=F360H BX=0005H CX=E020H ADD AX,CX ADC DX,BX 运算结果:DX=0008H AX=D380H

西夏区17281884239: 帮忙写一个简单的汇编程序 -
虞媛艾欣: DSEG SEGMENT table DB 100 DUP(1)A DB 0B DB 0C DB 0 DSEG ENDS CSEG SEGMENT ASSUME CS:CSEG,DS:DSEG START: MOV AX,DSEG MOV DS,AX;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>;代码添加处;>>...

西夏区17281884239: 帮忙写个汇编语言循环程序,分支程序,数据结构程序.简单的就行~~~~~ -
虞媛艾欣: #include void main() {float y,x; printf("input a number to x: "); scanf("%f",&x); if(xy=x-3; if(x>0&&xy=x*x-2*x+1; if(x>=1) y=x*x*x+5*x+2; printf("%f",y); printf("\n"); }

西夏区17281884239: 求高手帮忙写一个汇编语言的简易交通灯程序 -
虞媛艾欣: 最简单的单片机交通信号灯 单片机要求使用 AT89C51,信号灯连接电路如下:东西:绿灯P0.0 黄灯P0.1 红灯P0.2 南北:绿灯P0.5 黄灯P0.6 红灯P0.7 运行步骤:开始 ↓ 东西 南北 都是红灯 ↓ 步骤(1) 南北绿灯亮15s,东西红灯亮15s.南北黄...

西夏区17281884239: 完成一个完整的简单汇编语言程序 -
虞媛艾欣: ;求Z=|X-Y| Dseg segment;数据段 x db 40h y db 98h z db ?Dseg ends sseg segment para stack;堆栈段 db 80h dup(0) sseg ends ;代码段 cseg segment assume cs:cseg,ds:dseg,ss:sseg;伪指令声明每个段与一个段寄存器建立一种对应关系...

西夏区17281884239: 用汇编语言设计一个简单程序 -
虞媛艾欣: dseg segment a db 2,7,9,3,1 c equ $-a dseg ends assume cs:cseg, ds:dseg cseg segment start: mov ax, dseg mov ds, ax mov cx, c xor bx, bx lea si, a m0: mov al, [si] cmp al, 5 jle m1 inc bx m1: inc si loop m0 mov ax, bx call print mov ax,4c00h int ...

西夏区17281884239: 求一个简单的汇编程序,该程序能求两个数的和 -
虞媛艾欣: .model small .stack .data sum dw ? .code .startup mov ax,num1 ;被加数 mov cx,num2 ;加数 add ax,cx mov sum,ax .exit 0end

西夏区17281884239: 求一段简单的8086汇编语言程序设计 -
虞媛艾欣: code segment assume cs:code start:mov bl,ah ;寄存器AX的高8位传送到寄存器BL mov dl,al ;AX的低8位传送到寄存器DL int 20h ;结束 code ends end start

西夏区17281884239: 用汇编语言编写一个简单程序
虞媛艾欣: 1.计算U=(X+(Y*Z-100))/W 其中:X,Y,Z,W均为十六位有符号数. 程序如下: DATA SEGMENT X DW 10 ;16位变量 Y DW 20 Z DW 30 W DW 40 U DW ?,? DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA START: MOV AX,DATA ...

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网