微机原理test指令(微机原理汇编语言:求数组元素的最大值和最小值)
本文目录
- 微机原理汇编语言:求数组元素的最大值和最小值
- 汇编语言小问题 微机原理
- 微机原理中,TEST AL,0是什么意思
- 微机原理8255编程
- 微机原理中 读端口的指令
- 微机原理cpm字符串的内容时si设置为-1可以改为0吗
- 微机原理汇编问题
微机原理汇编语言:求数组元素的最大值和最小值
汇编语言,求最大值、最小值、中值,参考代码和程序相关注释如下:通过键盘输入7个不相等的数据(数据均介于0-255之间),将最小值、最大值和中值显示在屏幕上;; 定义常量Yes equ 1No equ 0On equ 1Off equ 0CR equ 0DHLF equ 0AHKBBack equ 8; -----------------------------------------; 定义结构类型Bubb_Para Struc ; 冒泡排序法参数表Carry DB No ; 是否带符号。Yes:有符号数;No:无符号数Sort DB No ; 升序/降序。Yes:升序;No:降序Yes_No DB 73h,76h,7dh,7ehLoad DB 0ach,0adhComp DB 3ah,3bhExchange DB 86h,87hStore DB 0aah,0abhBubb_Para EndS; -----------------------------------------; 功能:按要求对数组元素排序,能够对字节元素、字元素进行无符号数、有符号数的升序、降序排序。; 子程序原型:对字节元素进行无符号升序排序。Bubbling Proc NearPUSH AXPUSH BXPUSH CXPUSH SIPUSH DI; ------------------根据排序参数,修改排序指令LEA SI,ParametersLEA DI,@@CompareMOV AL,TYPE NumberDEC ALPUSH AXLEA BX,XLATMOV ,ALPOP AXPUSH AXLEA BX,XLATMOV ,ALPOP AXPUSH AXLEA BX,XLATMOV ,ALPOP AXLEA BX,XLATMOV ,ALMOV AL,SHL AL,1OR AL,XOR AH,AHLEA BX,XLATMOV ,AL; ------------------按要求排序MOV CX,Elements-1 ;外循环次数@@Scanning: PUSH CX ;入栈保存外循环次数LEA SI,Number ;数组首地址装入源变址寄存器@@Compare: PUSH SIPOP DI ;当前数组元素地址赋给目的变址寄存器,以备交换之用LODSB ;将当前数组元素读入累加器CMP AL, ;当前数组元素与相邻的下一个数组元素相比较JBE @@NextOne ;若小于或等于,不作数据交换,处理下一个数组元素XCHG AL, ;若大于,交换数组元素STOSB ;保存数值较小者@@NextOne: LOOP @@Compare ;处理下一个数组元素POP CX ;外循环次数出栈LOOP @@Scanning ;下一趟比较; ------------------POP DIPOP SIPOP CXPOP BXPOP AXRETBubbling EndP; -----------------------------------------; 功能:显示指定地址(Str_Addr)的字符串; 入口:; Str_Addr=字符串地址(要求在数据段); 用法: Output Str_Addr; 用法举例:Output PromptStrOutput MACRO Str_Addrlea dx,Str_Addrmov ah,9int 21hEndM; -----------------------------------------; 功能:取光标位置; 入口:无; 出口:DH=行号,DL=列号GetCursor Proc NearPUSH AXPUSH BXPUSH CXXOR BX,BXMOV AH,3INT 10HMOV Cursor_Row,DHMOV Cursor_Col,DLPOP CXPOP BXPOP AXRETCursor_Row DB ?Cursor_Col DB ?GetCursor EndP; -----------------------------------------; 功能:置光标位置; 入口:Cursor_Row=行坐标; Cursor_Col: 列坐标)SetCursor Proc NearPUSH CXPUSH BXPUSH AXMOV DH,Cursor_RowMOV DL,Cursor_ColXOR BX,BXMOV AH,2INT 10HPOP AXPOP BXPOP CXRETSetCursor EndP; -----------------------------------------; 功能:输出回车换行enter_CTLF proc Nearpush axpush dxmov ah,02hmov dl,0dhint 21hmov dl,0ahint 21hpop dxpop axretenter_CTLF endp; -----------------------------------------; 功能:键盘输入一个N位的十进制数字,; 数据输入说明:; 1、输足N位的,不用回车,自然结束本数据输入;; 2、不足N位的,需回车结束本数据输入; 入口:N=数字位数;di=保存输入的数字首地址; 出口:转换后的二进制数保存在di所指的单元Input_Digit Proc Nearpush dxpush cxpush bxpush dilea di,@@Save_Tmppush dicldmov cx,Npush cx@@Input: call GetCursor ;取光标位置mov ah,1 ;从键盘接受一个字符int 21hcmp al,CR ;若键入的是回车,已经键入的数字不足N位jz @@ASC_Dec ;转去处理已经键入的数字cmp al,KBBackjz @@KB_Back ;若是回空键,重新输入cmp al,’0’jb @@KBBack ;若低于数字’0’,重新输入cmp al,’9’ja @@KBBack ;若低于数字’9’,重新输入jmp @@Save_Dig@@KB_Back: dec Cursor_Colinc cxdec di@@KBBack: call SetCursor ;置光标位置jmp @@Input@@Save_Dig: and al,0fh ;转换成二进制数stosb ;保存loop @@Input ;接受下一个数字@@ASC_Dec: mov ax,cxpop cxpop sisub cx,ax ;实际输入的数字位数xor dx,dxxor ax,axjcxz @@Save_Ret ;若直接回车,没有输入任何数字,按输入’0’处理dec cx ;实际输入的数字位数减1,准备把输入的这一串数字转换成二进制数mov bl,10@@Mul_Ten: lodsbcbwadd ax,dxmul blmov dx,axloop @@Mul_Tenlodsbcbwadd ax,dx@@Save_Ret: pop distosbpop bxpop cxpop dxret@@Save_Tmp db 16 dup(?)Input_Digit EndP; -----------------------------------------; 功能:把AL中的二进制无符号数转换成显式的十进制ASCII码; 入口:AL=二进制数;di=转换后的ASCII保存地址; 出口:无Dec_ASCII Proc Nearpush sipush cxpush bxpush dimov bl,10xor cx,cxlea di,@@Temp_Savecld@@Divide: xor ah,ahdiv blor ah,30hmov ,ahdec diinc cxtest al,0ffhjnz @@Dividepush dipop siinc sipop dipop bxpush direp movsbmov byte ptr ,’$’pop dipop cxpop siret@@Temp_Save db 4 dup(?)Dec_ASCII EndP; -----------------------------------------N equ 3 ;数字位数(介于0-255之间的无符号数)Elements equ 7 ;数据个数PromptStr db ’Please Enter ’,N or 30h,’ digits for ’,Elements or 30h,’ numbers: $’Max_Num db 13,10,13,10,’The maximum is $’Mix_Num db 13,10,13,10,’The miximum is $’Mid_Num db 13,10,13,10,’The midoule is $’Number db Elements dup(?) ;从键盘接受的Elements个N位数字Parameters Bubb_Para 《No,No》 ;无符号数降序排序Start: push cspop dspush cspop es ;使数据段、附加段与代码段同段; 通过键盘输入7个不相等的数据(数据均介于0-255之间),将最小值、最大值和中值显示在屏幕上Output PromptStr ;提示输入Elements个N位数字lea di,Number ;数字存放地址mov cx,Elements ;数据个数Read_Number:call enter_CTLF ;输入一个回车、换行call Input_Digit ;从键盘接受指定位数的数据loop Read_Numbercall Bubbling ;无符号数降序排序Output Max_Num ;最大值mov al,Number ;取最大值lea di,Temp_STr ;显式的十进制ASCII码字符串暂存地址call Dec_ASCII ; 把AL中的二进制无符号数转换成显式的十进制ASCII码Output Temp_STr ;显示最大值Output Mix_Num ;最小值mov al,Number ;取最小值lea di,Temp_STr ;显式的十进制ASCII码字符串暂存地址call Dec_ASCII ; 把AL中的二进制无符号数转换成显式的十进制ASCII码Output Temp_STr ;显示最小值Output Mid_Num ;中值mov al,Number ;取中值lea di,Temp_STr ;显式的十进制ASCII码字符串暂存地址call Dec_ASCII ; 把AL中的二进制无符号数转换成显式的十进制ASCII码Output Temp_STr ;显示中值Exit_Proc: mov ah,4ch ;结束程序int 21hTemp_STr:Code ENDSEND Start ;编译到此结束
汇编语言小问题 微机原理
怎么没有看到问题啊?等待中................. 第一题:当前指令物理地址是由cs:ip决定的,则下一条指令应该是cs*16+(ip+2H)=10000H+102H=10102H当前栈顶物理地址为SS*16+SP=40200H对应的段寄存器是DS所以物理地址是DS*16+BX=20300H对应的是SS所以物理地址是SS*16+BP=40400HES:的物理地址为ES*16+BX+SI=30800H第二题:对16位数的第6、7、8、12、13位判断,只要用test指令就可以了DATA SEGMENT ;数据段定义 S1 DB ’ZERO’,’$’ ;为零时输出的内容 S2 DB ’NOT ZERO’,’$’ ;不为零时输出的内容DATA ENDSCODE SEGMENT ;代码段执行 ASSUME CS:CODE,DS:DATA ;初始化START: MOV AX,DATA MOV DS,AX ;确定段地址 TEST BX,18EOH ;对6、7、8、12、13位进行测试 JZ Z ;如果为零跳转到Z执行 LEA DX,S2 ;不为零执行 JMP DO Z:LEA DX,S1 DO: MOV AH,09H ;调用dos中断,输出提示信息 INT 21H MOV AH,4CH INT21HCODE ENDSEND START第三题: MOV CL,300;溢出错误 MOV BX,Dl;原操作数和目标操作数位数不一致 MOV ES,1000H;段寄存器不能立即寻址 TEST BX,;test原操作数不能用内存变量 SUB ;内存和内存间不能直接操作
微机原理中,TEST AL,0是什么意思
TEST AL, 0 功能是:检测 AL 中的值是否为零,但不改变AL的值。若AL值为零,则标志位ZF =1; 否则,ZF=0
微机原理8255编程
;;8255硬件连接及软件设置:;;B口方式0输入,PB0~PB3分别连接K1~K4;;;A口方式0输出,PA0~PA3外接驱动电路控制灯的4种动作;;;驱动电路,可由74LS06、ULN2003作反相电流放大驱动继电器或固体继电器组成;;;C口闲置;;;按以上设置,8255方式控制字是82H ;;;在PC机作主机的系统中,8255的4个寄存器地址是:;;A口60H,B口61H,方式控制寄存器63H。 ;;汇编程序如下:SSEG SEGMENT PARA STACK ;堆栈段定义 DW 30H DUP(?)SSEG ENDS CSEG SEGMENT ;代码段定义 ASSUME CS:CSEG,DS:CSEG ORG 200h ;主程序首址START: MOV AL, 82H ;方式控制字 MOV DX, 63H OUT DX, AL ;方式控制字送入方式控制寄存器Scan: IN AL,61H ;扫描从B口读入的K1~K4状态 CALL PRC1 ;开灯、关灯 CALL PRC2 ;是否暂停 CALL PRC3 ;是否换向 CALL PRC3 ;是否移动 JMP Scan ;主程序循环 PRC1 PROC NEAR ;"开/关灯"操作 子程序定义 PUSH AX ;B口状态进栈暂存 TEST AL,00000001B ;检测PB0输入状态 JZ CloseL ;若PB0低电平,表示K1断,转CloseL处执行OpenL: OUT 60H,AL ;若PB0高电平,表示K1通,PA0输出高电平,开灯 JMP RT1 ;转RT1处指令返回CloseL: MOV AL,00000000B ;PA0输出低电平 OUT 60H,AL ;关灯 RT1: POP AX ;B口状态出栈 RET ;返回主程序PRC1 ENDP ;子程序定义完毕PRC2 PROC NEAR ;"暂停"操作 子程序定义 PUSH AX ;B口状态进栈暂存 TEST AL,00000010B ;检测PB1输入状态 JZ RT2 ;若PB1低电平,表示K2断,不暂停PAUS: OUT 60H,AL ;若PB1高电平,表示K2通,PA1输出高电平,暂停 RT2: POP AX ;B口状态出栈 RET ;返回主程序PRC2 ENDP ;子程序定义完毕 PRC3 PROC NEAR ;"换向"操作 子程序定义 PUSH AX ;B口状态进栈暂存 TEST AL,00000100B ;检测PB2输入状态 JZ RT3 ;若PB2低电平,表示K3断,不换向CHG: MOV AL,00000101B ;若PB2高电平,表示K3通 OUT 60H,AL ;PA2、PA0输出高电平、换向,灯保持亮 RT3: POP AX ;B口状态出栈 RET ;返回主程序PRC3 ENDP ;子程序定义完毕PRC4 PROC NEAR ;"移动"操作 子程序定义 TEST AL,00001000B ;检测PB3输入状态 JZ RT4 ;若PB3低电平,表示K4断,不移动MOVE: MOV AL,00001001B ;若PB3高电平,表示K4通 OUT 60H,AL ;PA3、PA0输出高电平、移动,灯保持亮RT4: RET ;返回主程序PRC4 ENDP ;子程序定义完毕CSEG ENDS ;代码段定义完毕 END START ;主程序结束
微机原理中 读端口的指令
next: in al,60h test al,02h jz next 这段代码是从60h端口读进数据,并测试第一位(实际是我们常说的第二位,因为计算机从0开始计数),如果是0,说明外设没有准备好,继续等待并测试,如果为1,说明外设已经准备好了,可以进行数据交换了,该程序段放在数据交换前。
微机原理cpm字符串的内容时si设置为-1可以改为0吗
微机原理及接口技术②加1指令INCINC只有1个操作数,指令在执行时,将操作数的内容加1。一般用在循环程序中修改指针和循环次数。它不影响进位标志CF。2、减法指令SUB SBB DEC NEG CMP①不带借位的减法指令SUB;带借位的减法指令SBB 格式:SUB DST,SRC; SBB DST,SRC功能:(DST)←(DST)-(SRC);(DST)←(DST)-(SRC)-CF 说明:这两条指令的执行都会影响条件码标志。溢出(OF)的判断:若两个操作数符号相反,而结果的符号与减数相同,则溢出(OF=1)。②比较指令CMP 格式:CMP OPR1,OPR2 功能:(OPR1)-(OPR2)说明:执行减法操作,但不保存结果,只根据结果设置相应的条件码标志。CMP指令后面往往跟着一条条件转移指令,根据比较结果产生不同的分支。例:已知数组首地址为1000H,段地址已放在DS中,末字为0FFFFH,试统计其中0的个数放在末字单元。MOV DX,0 LEA SI,LOP:CMP WORD PTR ,FFFFH JZ END0CMP WORD PTR ,DX17微机原理及接口技术BEGIN 0→(DX) 1000H→(SI) =0? Y (DX)←(DX)+1 保存结果 END (SI)←(SI)+23、乘法指令无符号数乘法指令MUL 带符号数乘法指令IMUL 格式:MUL SRC;IMUL SRC功能:(AX)←(AL)×(SRC);(DX,AX)←(AX)×(SRC)说明:进行乘法运算时,如果两个8位数据相乘,会得到一个16位的乘积;如果两个16位数相乘,会得到一个32位的乘积。8086在执行乘法指令时,有一个乘数总是放在AL或者AX中。当得到16位积时,结果放在AX中;而得到32位积时,结果放在DX和AX两个寄存器中,DX中为乘积的高16位,AX中为乘积的低16位。4、除法指令无符号数除法指令DIV 带符号数除法指令IDIV 格式:DIV SRC;IDIV SRC说明:8086执行除法运算时,规定除数必须为被除数的一半长度。即被除数为16位时,除数为8位,被除数为32位时,除数为16位。16位的被除数放在AX中,32位的被除数放在DX和AX中。当被除数为16位,除数为8位时,得到8位的商18微机原理及接口技术放在AL中,8位的余数放在AH中。当被除数为32位,除数为16位时,得到16位的商放在AX中,16位的余数放在DX中。 四、逻辑运算及移位指令1、逻辑运算指令 AND OR NOT XOR TESTNOT为单操作数指令,不允许使用立即数,不影响标志位。其它四条指令为双操作数指令,使CF和OF为0,AF无定义,而SF、ZF和PF则根据运算结果设置。①AND格式:AND DST,SRC 功能:操作数某位清0。 ②OR 操作数某位置1。 ③XOR 对操作数清0。④TEST 执行AND运算,不保存结果,一般用来检测指定位是1还是0 2、移位指令SHL SHR SAL SAR ROL ROR RCL RCR 说明:格式相同,双操作数指令无符号数使用逻辑移位指令,带符号数使用算术移位指令 左移一次相当于乘2,右移一次相当于除2 移位次数n》1时,n必须预先存入CL中 移位指令影响SF、ZF、PF 五、串操作指令MOVS CMPS SCAS LODS STOS 1、串传送MOVSB MOVSW功能:把SI指向的数据段中的一个字节或字传送到由DI指向的附加段中的一个字节或字中去,同时根据方向标志及数据格式修改SI和DI。例:试将字符串MESS1传送到MESS2区域,设MESS1和MESS2的段地址已分别存入DS和ES中。方法1:LEA SI,MESS1 LEA DI,MESS219微机原理及接口技术MOV CX,8 NEXT:MOV AL,,AL INC SI INC DI DEC CX JNZ NEXT方法2:使用串传送指令。在使用该指令之前,必须先做四件事:a.设置方向标志b.源串起始地址→DS:SI c.目的串起始地址→ES:DI d.数据个数→CX CLDLEA SI,MESS1 LEA DI,MESS2 MOV CX,8 REP MOVSB2、串比较指令CMPSB CMPSW 使用前缀REPE和REPNEREPE/REPZ:两数相等就可以继续比较;如遇到两数不相等可提前结束。 REPNE/REPNZ:两数比较不相等,就可以继续串比较指令;如遇到某此比较相等,则可提前结束。
微机原理汇编问题
;输入被加数mov ah,1int 21hmov bl,al ;输入加数mov ah,1int 21h ;输出求和表达式mov dl,blmov ah,2int 21hmov dl,’+’int 21hmov dl,alint 21hmov dl,’=’int 21h ;求和and bl,0fhand al,0fhadd al,bldaa ;输出结果高位mov dl,almov cl,4shr dl,clor dl,30Hmov ah,2int 21h ;输出结果低位mov dl,aland dl,0fhor dl,30Hmov ah,2int 21h
更多文章:
电影api免费接口(API是作什么用的,每台电脑都有吗没有它会怎样谢谢!)
2024年6月29日 11:31
termux使用教程python(termux敲完代码去哪里看运行结果图像)
2024年7月22日 01:30
if if else怎么执行(想请教c语言这种if--else语句如何执行假如: int a=0; if(a==0) {a=1;执行)
2024年7月19日 15:30
java运行软件放固态盘吗(买办公电脑 做java开发用 我应该怎么选电脑,以内存为主还是cpu为主,还是固态硬盘为主最好是)
2024年9月9日 06:15
架构师工资一月多少(如何从三流程序员成长为年薪50W的架构师)
2024年6月29日 03:44
plsqldeveloper使用教程(怎么使用plsql developer)
2024年5月15日 10:55
runtime error 错误怎么解决(游戏途中出现runtimeerror怎么解决)
2024年7月9日 04:05
vlookup根据姓名匹配学号(excel按照姓名自动匹配数据)
2024年7月3日 08:44
advisable(advisable和available的区别)
2024年7月16日 23:26
伟福编译器下载(有谁用过伟福单片机编译器啊我在编译时总是出现“列表文件<.LST>未找到.这是怎么回事啊,)
2024年5月18日 00:55
python是什么东西(Python最近听说又火了一把,人工智能到底是个什么东西呢)
2024年7月3日 20:49
power bi官网首页(PowerBI官方授权账号,近万人注册成功!)
2024年6月29日 02:36