主要问题是:for(i=0.j=0*(i+s)!=’\0‘;i++)后面多了个""分号
main函数中的char *item没有分配空间,会报错的
void delnum(char *s)
{
int i = 0
int j = 0
for(i=0, j=0*(s+i) != '\0'i++)
{
if(s[i]<'0'|| s[i]>'9')
{
s[j]=s[i]
j++
}
}
s[j]='\0'
}
main()
{
char item[1024]={}
printf(“\ninput the string:\n”)
gets(item)
delnum(item)
printf(“\n%s”,item)
}那个void show7() 后面有中文的东西
你肯定没看清,没有删去。
编译过了,有个警告,说有个东西没调用。你自己看着办了。
#include <reg51.h>
#include <absacc.h>
#include <intrins.h>
sbit P_00=P0^0
sbit P_01=P0^1
sbit P_02=P0^2
sbit P_03=P0^3
sbit P_14=P1^4
sbit P_20=P2^0
#define uchar unsigned char
#define uint unsigned int
uchar key,n=0,m=0long h=0
uchar a[]={00000000,00000001,00000010,00000011,00100000,00100001,00100010,00100011,01000000,01000001}
void delay10ms()
{uchar i,j
for(i=0i<10i++)
for(j=0j<120j++)
}
uchar key_scan() //P1口低四位接4个开关
{P1=0xFF
if(P1&0xFF!=0xFF)
{delay10ms()
if(P1&0xFF!=0xFF)
{switch(P1)
{
case 0xFE:
key=1break
case 0xFD:
key=2break
case 0xFB:
key=3break
case 0xF7:
key=4break
default:break
}
}
return key
}
else
P_20=0
}
uchar key_free()
{key=key_scan()
P1=0xFF
while(P1&0xFF!=0xFF)
{}
return key
}
/*void show()错误显示在该行、
{
if((n<=9)&&(n>=1))
P0=a[n]
else
P0=a[0]
}*/
void show7()
{
if((n <= 9) &&(n >= 1))
{
P0 = a[n]
}
else
{
P0 = a[0]
}
}
void maichong()
{uint k
P_20=0
while(1)
{for(k=1k<=500k++)
P_20=~P_20
if(P_20==1)
h++
if(h=1600*n)
P_20=0
}
}
void main()
{while(1)
{key_scan()
key_free()
n=n+key
if((m++<5)&&(P_14==0))
show7()
maichong()
}
}2012年〈汇编语言程序设计〉半期试题(堂下开卷)
,每小题3分,共15分)试解释下列名词的含义。
1. 逻辑地址:在CPU内部的存储单元地址表示形式,分为段基值和偏移量两个组成部分,
它们都是16位的,在指令或源程序中只能使用逻辑地址来表达存储单元。
2. 物理地址:CPU访问存储单元时向地址总线传送的地址表示形式,是20位的地址,由
逻辑地址中段基值乘以16再加上偏移量得到,逻辑地址到物理地址的转换由CPU在执行访问存储单元的指令时自动完成。
3. 标志寄存器:在CPU中由状态标志位与控制标志位组成的寄存器称为标志寄存器,其
中状态标志位用于标识运算指令执行后运算结果的特征,控制标志位用于控制CPU的工作模式或改变CPU对某些事件的响应方式。
4. 存储器寻址方式:即获得存储单元地址的方式,在8086/8088CPU中包括直接寻址、寄
存器间接寻址、基址寻址、变址寻址、基址变址寻址这五种寻址方式。
5. 补码:CPU内部用于表示带符号数的一种编码,正数的补码为真值本身,负数的补码为
真值变反加1的结果。
二.计算题(本大题共5小题,每小题4分,共20分)试按照各小题的要求给出计算结果。
1. 将十进制数100分别转换为二进制、十六进制数,它们的表示形式分别为多少? 答:100的十六进制表示为64H,二进制表示为01100100B。 2. 假设(DS)=0B00H,(BX)=0210H,对于指令MOV DS:120H[BX],AL,其目的
*** 作数的物理地址为多少?
答:EA=(BX)+120H = 0210H+0120H = 0330H,物理地址 = (DS)*16+EA = 0B000H+0330H=0B330H。 3. 假设(BX)=0210H,(DI)=0060H,对于指令ADD DL,[BX][DI],其源 *** 作数的偏
移量为多少?
答:源 *** 作数EA = (BX)+(DI)= 0210H+0060H =0270H。 4. 假设当前(SP)=0060H,连续执行5条PUSH指令后,(SP)=? 答:(SP)=0060H – 5*2 = 0060H – 000AH = 0056H
5. 对于一个十进制数 – 65,其二进制补码表示形式为多少?
答:先将数值转换为二进制表示: - 65 = - 41H = - 01000001B ,由于是负数,变反加1得到补码形式:10111110B +00000001B = 10111111B
三.排错题(本大题共4小题,每小题5分,共20分)每小题列出了一条指令,判断该指
令有无语法错误,如果存在语法错误,请指出具体的错误原因,判断正确给2分,分析正确给3分,判断错误不给分。
1. PUSH 5588H
答:错误,单 *** 作数指令不能使用立即数寻址方式。 2. MOV DS, 1720H
答:错误,MOV指令不能将立即数直接传送至段寄存器,需要通用寄存器作为中转。 3. ADD AX, CL
答:错误,两个 *** 作数的类型不匹配,AX为16位,CL为8位。 4. AND AX,[DX]
答:错误,DX寄存器不能用作存储器寻址方式中的基址或变址分量。
四.程序分析题(本大题共6小题,每小题5分,共30分)每小题列出了一段小的程序片段和相关存储单元的初始值,请按题目的要求分析各程序片段
的运行结果。(寄存器中的内容请使用十六进制形式给出)
1. 阅读如下程序片段
MOV AL,4CH MOV BL,0B5H ADD AL,BL
执行上述程序片段后,(AL)= 01H (1分),(BL)= 0B5H (1分), CF= 1 (1分),OF= 0 (1分),PF= 0 (1分)
2. 阅读如下程序片段
MOV AL,0F3H MOV DL,0C4H ADD AL,DL AND AL,0FH
执行上述程序片段后,(AL)= 07H (1分),(AF)=不确定 (1分), CF= 0 (1分),OF= 0 (1分),PF= 0 (1分)
3. 阅读如下程序片段
MOV AL,7EH MOV CL,04H ROL AL,CL
执行上述程序片段后,(AL)=0E7H(2分),(CL)=04H (1分), CF= 1 (1分),OF=不确定 (1分)
4. 阅读如下程序片段
MOV AX,0632H MOV BX,0C202H SUB AX,BX INC AX
执行上述程序片段后,(AX)= 4431H(2分),(CF)= 1 (2分), OF= 0 (1分)
5. 阅读如下程序片段,假设(DS)=0100H,字节单元(01024H)=56H,字节单元(01025H)
=28H
MOV BX,0024H LEA BX,[BX] ORBX,0 ADC BX,[BX]
执行上述程序片段后,(BX)= 287AH(3分),(CF)=0 (2分), OF= 0 (1分)
6. 阅读如下程序片段,假设(SP)=0064H
MOV AX,0001H MOV BX,0002H PUSH AX PUSH BX POPCX POPBX
执行上述程序片段后,(AX)=0001H (2分),(BX)= 0001H(2分), (SP)= 0064H(1分)
五.程序设计题(本大题共2小题,第一小题7分,第二小题8分,共15分)
1. 试编写一程序片段,实现BL高4位与低4位相互交换(7分) 答:
mov cl, 4 rol bl, cl
2. 试编写一程序片段,不使用乘除法指令,实现((AX)*5+14)/ 2的功能(AX中的数
据理解为补码)(8分) 答:
mov bx, ax mov cl, 2 sal ax, cl add ax, bx add ax, 14 sar ax, 1
评论列表(0条)