1500字范文,内容丰富有趣,写作好帮手!
1500字范文 > [汇编语言] 循环与分支程序设计 例题

[汇编语言] 循环与分支程序设计 例题

时间:2021-05-15 20:19:19

相关推荐

[汇编语言] 循环与分支程序设计 例题

分支程序设计

MOV AX,XPUSH AXSUB AX,50JG TOO_MUCHPOP AXSUB AX,YJO OVERFLOWJNS FUZHINEG AXFUZHI:MOV RESULT,AXTOO_MUCH:OVERFLOW:

CMP DX,BXJG L1JL L2CMP AX,CXJA L1JMP L2L2:L1:

这题需要注意,低位比较的条件转移时应该使用无符号数JA与JB(也就是Above与below),而高位是带符号数的JG与JL(greater与less)。

这题具体考察了无符号数与带符号数的条件转移指令的使用。

MOV AX,XCMP AX,0JGE A1MOV Y,-1JMP EXITA1:JG A2MOV Y,0JMP EXITA2:MOV Y,1JMP EXITEXIT:INT 21H

MOV AX,XCMP AX,YJG L1MOV AX,YL1:CMP AX,ZJGE L2MOV AX,ZL2:MOV MAX,AX

循环程序设计

MOV CX,MMOV AX,0MOV SI,AXAGAIN:ADD AX,ARRAY[SI]INC SI;这里是错误的LOOP AGAINMOV TOTAL,AX

首先解释错误原因:由于这里是字相加,因而,每次应该加两个字节;另外一个需要注意的是:ADD AX,ARRAY[SI]这里使用寄存器相对寻址方式,而寄存器寻址方式使用的寄存器是固定的,只有基址寄存器(BX/BP)和变址寄存器(DI/SI)四个,不要瞎用

正确解法:

MOV CX,MMOV AX,0MOV SI,AXAGAIN:ADD AX,ARRAY[SI]ADD SI,2LOOP AGAINMOV TOTAL,AX

代码详细解释:BX寄存器的二进制数用十六进制数的形式在屏幕上显示出来

对于ascll的数值可以从这里找到:十六进制到十进制的转换

MOV CH,4MOV CL,4AGAIN:ROL BX,CLMOV AX,BXAND DL,0FHADD AL,30HCMP AL,39HJBE PRINTADD AL,7JMP PRINTDEC CHJNZ AGAINPRINT:MOV DL,ALMOV AH,02HINT 21H

MOV AX,BUFMOV CX,0ROTATE:AND AX,AXJZ EXITSHL AX,1JNC ROTATEINC CXJMP ROTATEEXIT:MOV COUNT,CXINT 21H

子程序思路

MOV BX,0NEWCHAR:MOV AH,1INT 21HSUB AL,30HJL EXITCMP AL,9JG EXITCBWMOV CL,10XCHG AX,BXMUL CLXCHG AX,BXADD BX,AXJMP NEWCHAR

说明,这里的键盘输入的十六进制的字母都是小写

MOV BX,0MOV CL,4MOV CH,4NEWCHAR:MOV AH,1INT 21HSUB AL,30HJL EXITCMP AL,10JL ADD_TOSUB AL,27HCMP AL,0AHJL EXITCMP AL,10HJGE EXITADD_TO:ADD BX,AL;这里错误SHL BX,CLDEC CHJNZ NEWCHAR

答题的过程中犯了严重的操作数类型不一致的错误,我想要BX与al相加,但是类型不匹配,因此需要mov ah,0再相加

正确答案为:

MOV BX,0MOV CH,4MOV CL,4NEWCHAR:MOV AH.1INT 21HSUB AL,30HJL EXITCMP AL,0AHJL ADD_TOSUB AL,27HJL EXITCMP AL,10HJGE EXITADD_TO:SHL BX,CLMOV AH,0ADD BX,AXDEC CHJNZ NEWCAHR

MOV AX,nMOV SI,0MOV array_head[SI-2],0FFFFHROTATE:CMP array_end[si],axJLE INSERTMOV array_end[si+2],array_end[si];这里是错误的SUB SI,2JMP ROTATEINSERT:MOV array_end[SI+2],AX

这里有个错误,双操作数不允许两个使用存储器,因此两个操作数之间必然有一个寄存器

修改的正确答案为:

MOV AX,nMOV array_head[si-2],0ffffhmov si,0rotate:cmp array_end[si],axjle insertmov bx,array_end[si]mov array_end[si+2],bxsub si,2jmp compareinsert:mov array_end[si+2],ax

这题首先得注意数据的定义问题,我们需要一个逻辑尺来作为加法还是减法的判断标准

data segmentx dw x1,x2,x3,x4,x5,x6,x7,x8,x9,x10y dw y1,y2,y3,y4,y5,y6,y7,y8,y9,y10z dw z1,z2,z3,z4,z5,z6,z7,z8,z9,z10data ends

在看完数据定义之后

事实上,存储的形式是这样的:

因此如果(按照答案的方向)从地址高位开始计算的话,逻辑尺应该为

00 1101 1100 (也就是先算z10)

那么数据定义部分为:

data segmentx dw x1,x2,x3,x4,x5,x6,x7,x8,x9,x10y dw y1,y2,y3,y4,y5,y6,y7,y8,y9,y10z dw z1,z2,z3,z4,z5,z6,z7,z8,z9,z10logic_rule dw 0DCH data ends

code segment main proc farassume ds:data,cs:codestart:push dsxor ax,axpush axmov ax,datamov ds,axmov bx,0;负责序号mov cx,10mov dx,logic_rule next:mov ax,x[bx]shr dx,1jc sub_add ax,y[bx]jmp resultsub_:sub ax,y[bx]result:mov z[bx],axadd bx,2loop nextretmain endpcode endsend start

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。