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);
}
其他的同上。