1. 编写C程序调用汇编语言,实现将1K大小的内存块以字节形式复制的另一内存地址
#include<stdio.h>
#define NUM 1024
int main()
{
char strFrom[NUM] = { "good good study, day day up." };
char strTo[NUM];
__asm
{
mov ecx, NUM;
lea esi, strFrom;
lea edi, strTo;
rep movsb;
}
printf("%s\n", strTo);
}
在VC里运行成功。不要用dev-c++,因为dev-c++用的是AT&T的语法。
2. 用汇编语言编写一个多字节压缩BCD加法程序。要求显示被加数、加数及结果。
只显示结果,加数、被加数的显示你自己琢磨吧!
CODESEGMENT
ASSUMECS:CODE
XDB12H,34H,56H
YDB65H,98H,98H
NEQU$-Y
ZDBN+1DUP(0)
START:PUSHCS
POPDS
PUSHCS
POPES;使数据段、附加段与代码在同一段中
MOVCX,N;字节数置入cx
MOVBX,0;基址寄存器置0
CLC;清进位借位标志
@0:
MOVAL,X[BX];将被加数的低字节移入al
ADCAL,Y[BX];带进未的加,加加数的低字节
DAA
MOVZ[BX],AL;将结果移入和的低字节
INCBX;基址寄存器加1
LOOP@0;循环
MOVBYTEPTRZ[BX],0;处理最高位
JNC@01
MOVBYTEPTRZ[BX],1
@01:
LEASI,Z;将和的首地址置入si
MOVCX,N+1;字节数置入cx
CLD
@1:
LODSB;装入和的低字节到al
CALLDSPAL;调用子程序以16进制形式显示(其实是显示bcd数)
LOOP@1;循环
MOVAH,4CH
INT21H
;=============================
DSPALPROCNEAR
PUSHAX
PUSHBX
PUSHCX
PUSHDX
PUSHF
MOVCX,2;一个字节只有2位的16进制数
MOVBX,AX;将al保存到bl中
@DSPAL1:
RORBL,1;循环将bl右移4次,即将高位移到右侧
RORBL,1
RORBL,1
RORBL,1
MOVDL,BL;放到dl中
ANDDL,0FH;清掉高位
CMPDL,9;和9比较
JA@DSPAL2;大于即在A~F之间
ADDDL,30H;否则就是0~9,加30H变为ASCii码
JMP@DSPAL3
@DSPAL2:
ADDDL,37H;加37H变为A~F的ASCii码
@DSPAL3:
MOVAH,2
INT21H
LOOP@DSPAL1;循环输出低位
MOVAH,2
MOVDL,'H';显示H
INT21H
MOVDL,32;显示空格
INT21H
POPF
POPDX
POPCX
POPBX
POPAX
RET
DSPALENDP
CODEENDS
ENDSTART
3. 编写一个程序显示你所使用的计算机中的各种数据类型的字节数。
如果你要知道一个int型的字节数可以这样写:
#include<stdio.h>
void main()
{
int x;
x=sizeof(int);
printf("%d",x);
}
其他的同上。