汇编源代码
常见汇编代码
常见汇编代码汇编语言是一种低级语言,主要用于编写计算机的指令集。
在程序开发和系统调试中,掌握常见的汇编代码是非常重要的。
本文将介绍一些常见的汇编代码及其用途。
一、数据传输指令1. MOV:将数据从一个位置复制到另一个位置。
例如,MOV AX, BX将BX寄存器中的数据复制到AX寄存器中。
2. XCHG:交换两个位置的数据。
例如,XCHG AX, BX将AX寄存器和BX寄存器中的数据进行交换。
3. PUSH:将数据推入栈中。
例如,PUSH AX将AX寄存器的数据推入栈中。
4. POP:将数据从栈中弹出。
例如,POP AX将从栈中弹出的数据存储到AX寄存器中。
二、算术指令1. ADD:将两个数相加并将结果存储在目标位置。
例如,ADD AX, BX将AX寄存器和BX寄存器中的数据相加,并将结果存储到AX寄存器中。
2. SUB:将两个数相减并将结果存储在目标位置。
例如,SUB AX, BX将AX寄存器中的数据减去BX寄存器中的数据,并将结果存储到AX寄存器中。
3. MUL:将两个数相乘并将结果存储在目标位置。
例如,MUL AX, BX将AX寄存器和BX寄存器中的数据相乘,并将结果存储到AX寄存器中。
4. DIV:将两个数相除并将结果存储在目标位置。
例如,DIV AX, BX将AX寄存器中的数据除以BX寄存器中的数据,并将商存储到AX寄存器中。
三、逻辑指令1. AND:对两个数进行逻辑与操作,并将结果存储在目标位置。
例如,AND AX, BX将AX寄存器和BX寄存器中的数据进行逻辑与操作,并将结果存储到AX寄存器中。
2. OR:对两个数进行逻辑或操作,并将结果存储在目标位置。
例如,OR AX, BX将AX寄存器和BX寄存器中的数据进行逻辑或操作,并将结果存储到AX寄存器中。
3. XOR:对两个数进行逻辑异或操作,并将结果存储在目标位置。
例如,XOR AX, BX将AX寄存器和BX寄存器中的数据进行逻辑异或操作,并将结果存储到AX寄存器中。
汇编源程序-字符串输入输出
5.3 字符串输入输出方法 5.3.1 字符串输出 【入口参数】AH = 9,是DOS的子功能号 DS:DX = 待输出字符串的首字符的逻辑地址 【说明】 (1)被输出的字符串的长度不限,但必须连续存放在内存的某个地方,且以ASCII值为24H的字符'$'结束,中间可以含有回车符、换行符、响铃符等特殊功能符号,存放字符串的起始逻辑地址必须放在指定的寄存器DS和DX中。
03
10号子功能在调用时等待操作员从键盘上按键,直到按下回车键为止,按键情况会显示在屏幕上,最后按下的回车键会导致回车操作。如果在按回车键之前发现输入有错误,可以使用退格键或向左的箭头进行修改。
04
Hale Waihona Puke 输入缓冲区的最前面一个字节(图5.3中len1处)的值由用户程序填写,用以指出允许输入的最大字符数。该值是字节型无符号数,有效范围是0~255,最后按的回车键也计算在内。当已输入len1–1个字符后就只能按回车键了,按其它键都会被认为是不正确的输入而不被机器认可,并且喇叭还会发出“嘀”的一声响以示警告。如果len1=1,表示只能按1个键,这个键只能是回车键,按其它键都会有“嘀”的一声警告;如果len1=0,表示一个键都不能按,包括回车键在内的任何按键都会被拒绝并且发出“嘀”的警告声,但机器又在等待输入,这一矛盾将导致无限期等待,即死机。
04
03
01
02
‘$’符本身不输出到屏幕。
调用结果是把字符串中的各个字符从光标当前所在位置起,依次显示在屏幕上,直至遇到‘$’为止,光标停在最后一个输出符号的后面。
如果程序中需要输出‘$’,只能用2号子功能实现。
9号子功能调用将影响AL的内容,不改变其余寄存器及标志寄存器的值。
【例5.5】分析下面的程序,写出程序执行后的结果。 data SEGMENT buf1 DB 'Hello, ',13,10, 'this is an example.$ ',13,10 buf2 DB '-- END --$' data ENDS code SEGMENT ASSUME CS:code,DS:data main:MOV AX,data MOV DS,AX
CRC 汇编代码
CRC源码大全〖文章转载或出处〗≡中国电子技术信息网≡网址:CRC源码大全循环冗余校验码(Cylclic Redundancy Check Code),简称CRC码。
常用的CRC数有8,16,32,CRC位数越大,数据越不易受干扰,但运算时间加长。
一般关于通信的书籍都有介绍。
简单原理是将要传输的数据视为一堆连续位组成的一整个数值,并将此数值除一个特定的除数,通常以二进制表示,此除数称为衍生多项式(Generation Polynomial).一般数据量不大时,使用Checksume验错方式就行了;数据量大时,就用CRC了;据理论统计,用CRC16时,超过17个连续位的错误侦测率为99。
9969%,小于此的为100%。
1、CRC-12 的生成多项式为:P(x)=X^12+X^11+X^3+X^2+12、CRC MOV DPH, #table ; 指向余式表下半区MOV DPL, R0 ; 指向对应单元CLR A ;MOVC A, @A+DPTR ; 读余式的高字节XRL A, R1 ; 计算余式的高字节MOV R0, A ; 存入R0INC DPH ; 指向余式表上半区CLR A ;MOVC A, @A+DPTR ; 读余式的低字节XRL A, R2 ; 计算余式的低字节MOV R1, A ; 存入R1RET这个是对于三字节的东东,你自己还要造张余式表3、很简单的查表法unsigned int UpdateCRC(unsigned char byte,unsigned int crc);#include <stdio.h>#include "crc16.h"static code unsigned int Crc16Table[256] ={0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5, 0x60c6, 0x70e7,0x8108, 0x9129, 0xa14a, 0xb16b, 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef,0x1231, 0x0210, 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c, 0xf3ff, 0xe3de,0x2462, 0x3443, 0x0420, 0x1401, 0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b, 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d, 0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6, 0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738, 0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5, 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823, 0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969, 0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96, 0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc, 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a, 0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03, 0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd, 0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6, 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70, 0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a, 0x9f59, 0x8f78,0x9188, 0x81a9, 0xb1ca, 0xa1eb, 0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1, 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067, 0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c, 0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2, 0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb, 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d, 0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447, 0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8, 0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2, 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634, 0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9, 0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827, 0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c, 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a, 0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0, 0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d, 0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07, 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1, 0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba, 0x8fd9, 0x9ff8,0x6e17, 0x7e36, 0x4e55, 0x5e74, 0x2e93, 0x3eb2, 0x0ed1, 0x1ef0 };unsigned int UpdateCrc16(unsigned char Octet,unsigned int CRC) {return Crc16Table[ (CRC >> 8) & 255] ^ (CRC << 8) ^ Octet;}unsigned int UpdateCRC(unsigned char Octet,unsigned int CRC) {return (CRC << 8) ^ Crc16Table[ (CRC >> 8) ^ Octet ];}4、_CRC:MOV A,R7 ;CRC INPUT POINTERMOV R1,AMOV B,R5MOV DPH,R6;#SRCADR ;CRC INPUT PAGE ADDRESS MOV DPL,R1MOV RCRC2L,#0MOV RCRC1H,#0MOV RCRC1L,#0CRCA:MOVX A,@DPTRXRL A,RCRC1HXRL A,RCRC2LMOV RXTEMP,AMOV RCRC2L,RCRC1LMOV DPTR,#CRCTAB1MOVC A,@A+DPTRMOV RCRC1H,AMOV A,RXTEMPINC DPHMOVC A,@A+DPTRMOV RCRC1L,AMOV DPH,R6;#SRCADR ;CRC INPUT PAGE ADDRESS INC R1MOV DPL,R1MOV A,R1CJNE A,B,CRCAMOV A,RCRC1HXRL A,RCRC2LCPL AMOV RCRC1H,AMOV A,RCRC1LCPL AMOV RCRC1L,AMOV R6,RCRC1HMOV R7,RCRC1LRET;-------------------------------------------CRCTAB1:DB 000H,089H,012H,09BH,024H,0ADH,036H,0BFHDB 048H,0C1H,05AH,0D3H,06CH,0E5H,07EH,0F7H DB 081H,008H,093H,01AH,0A5H,02CH,0B7H,03EHDB 0C9H,040H,0DBH,052H,0EDH,064H,0FFH,076H DB 002H,08BH,010H,099H,026H,0AFH,034H,0BDH DB 04AH,0C3H,058H,0D1H,06EH,0E7H,07CH,0F5H DB 083H,00AH,091H,018H,0A7H,02EH,0B5H,03CH DB 0CBH,042H,0D9H,050H,0EFH,066H,0FDH,074H DB 004H,08DH,016H,09FH,020H,0A9H,032H,0BBH DB 04CH,0C5H,05EH,0D7H,068H,0E1H,07AH,0F3H DB 085H,00CH,097H,01EH,0A1H,028H,0B3H,03AH DB 0CDH,044H,0DFH,056H,0E9H,060H,0FBH,072H DB 006H,08FH,014H,09DH,022H,0ABH,030H,0B9H DB 04EH,0C7H,05CH,0D5H,06AH,0E3H,078H,0F1H DB 087H,00EH,095H,01CH,0A3H,02AH,0B1H,038H DB 0CFH,046H,0DDH,054H,0EBH,062H,0F9H,070H DB 008H,081H,01AH,093H,02CH,0A5H,03EH,0B7H DB 040H,0C9H,052H,0DBH,064H,0EDH,076H,0FFH DB 089H,000H,09BH,012H,0ADH,024H,0BFH,036H DB 0C1H,048H,0D3H,05AH,0E5H,06CH,0F7H,07EH DB 00AH,083H,018H,091H,02EH,0A7H,03CH,0B5H DB 042H,0CBH,050H,0D9H,066H,0EFH,074H,0FDH DB 08BH,002H,099H,010H,0AFH,026H,0BDH,034H DB 0C3H,04AH,0D1H,058H,0E7H,06EH,0F5H,07CH DB 00CH,085H,01EH,097H,028H,0A1H,03AH,0B3H DB 044H,0CDH,056H,0DFH,060H,0E9H,072H,0FBH DB 08DH,004H,09FH,016H,0A9H,020H,0BBH,032H DB 0C5H,04CH,0D7H,05EH,0E1H,068H,0F3H,07AH DB 00EH,087H,01CH,095H,02AH,0A3H,038H,0B1H DB 046H,0CFH,054H,0DDH,062H,0EBH,070H,0F9H DB 08FH,006H,09DH,014H,0ABH,022H,0B9H,030H DB 0C7H,04EH,0D5H,05CH,0E3H,06AH,0F1H,078HCRCTAB2:DB 000H,011H,023H,032H,046H,057H,065H,074HDB 08CH,09DH,0AFH,0BEH,0CAH,0DBH,0E9H,0F8H DB 010H,001H,033H,022H,056H,047H,075H,064HDB 09CH,08DH,0BFH,0AEH,0DAH,0CBH,0F9H,0E8H DB 021H,030H,002H,013H,067H,076H,044H,055HDB 0ADH,0BCH,08EH,09FH,0EBH,0FAH,0C8H,0D9H DB 031H,020H,012H,003H,077H,066H,054H,045HDB 0BDH,0ACH,09EH,08FH,0FBH,0EAH,0D8H,0C9H DB 042H,053H,061H,070H,004H,015H,027H,036HDB 0CEH,0DFH,0EDH,0FCH,088H,099H,0ABH,0BAH DB 052H,043H,071H,060H,014H,005H,037H,026HDB 0DEH,0CFH,0FDH,0ECH,098H,089H,0BBH,0AAH DB 063H,072H,040H,051H,025H,034H,006H,017HDB 0EFH,0FEH,0CCH,0DDH,0A9H,0B8H,08AH,09BH DB 073H,062H,050H,041H,035H,024H,016H,007HDB 0FFH,0EEH,0DCH,0CDH,0B9H,0A8H,09AH,08BH DB 084H,095H,0A7H,0B6H,0C2H,0D3H,0E1H,0F0H DB 008H,019H,02BH,03AH,04EH,05FH,06DH,07CH DB 094H,085H,0B7H,0A6H,0D2H,0C3H,0F1H,0E0H DB 018H,009H,03BH,02AH,05EH,04FH,07DH,06CH DB 0A5H,0B4H,086H,097H,0E3H,0F2H,0C0H,0D1H DB 029H,038H,00AH,01BH,06FH,07EH,04CH,05DH DB 0B5H,0A4H,096H,087H,0F3H,0E2H,0D0H,0C1H DB 039H,028H,01AH,00BH,07FH,06EH,05CH,04DH DB 0C6H,0D7H,0E5H,0F4H,080H,091H,0A3H,0B2H DB 04AH,05BH,069H,078H,00CH,01DH,02FH,03EH DB 0D6H,0C7H,0F5H,0E4H,090H,081H,0B3H,0A2H DB 05AH,04BH,079H,068H,01CH,00DH,03FH,02EH DB 0E7H,0F6H,0C4H,0D5H,0A1H,0B0H,082H,093H DB 06BH,07AH,048H,059H,02DH,03CH,00EH,01FH DB 0F7H,0E6H,0D4H,0C5H,0B1H,0A0H,092H,083H DB 07BH,06AH,058H,049H,03DH,02CH,01EH,00FHend5、uint crc(uchar * byte,uchar nbyte) //CRC校验{uint data itemp=0;uchar data i,j;bit flag;for(i=0;i<nbyte;i++){itemp^=(byte[i]<<8);for (j=0;j<8;j++){flag=itemp&0x8000;itemp<<=1;if(flag){itemp^=0x1021;}}}return itemp;}6、CREATCRC: ; ----- CRC-16 ----- MOV R2,#00HMOV R3,#00HCRCATER2: MOV A,@R0XRL A,R3LCALL CRCCRT1XRL A,R2MOV R3,AMOV R2,BINC R0DJNZ R5,CRCA TER2MOV @R0,BINC R0MOV @R0,ARETCRCCRT1:MOV R7,#08HMOV B,#00HCRT1LOP1: CLR CPUSH ACCMOV A,BRLC AMOV B,APOP ACCRLC AJNC CRT1LOP2PUSH ACCMOV A,BXRL A,#CRCGENLMOV B,APOP ACCXRL A,#CRCGENHCRT1LOP2: DJNZ R7,CRT1LOP1 RETRECEIVE:SETB F0LCALL CREATCRCMOV A,CCRC1XRL A,@R0JNZ ERRORCRCINC R0MOV A,CCRC2XRL A,@R0JNZ ERRORCRCLJMP EENDERRORCRC: CLR F0EEND: RET7、1) 求CRC码的运算采用模2运算, 所谓模2运算就是不带进位和借位, 因此加法和减法等价,实际上就是逻辑上的异或运算, 除法可以用多次模2减法实现.2) 所谓CRC码, 就是把数据块左移16位, 然后除以0x11021所得到的余数(由CCITT推荐).3) 据此写出以下的CRC的C程序. *ptr指向发送数据块的首地址, len是数据块以字节为单位的长度.uint cal_crc(uchar *ptr, uchar len) {uint crc;uchar i;crc=0;while(len--!=0) {for(i=0x80; i!=0; i/=2) {if((crc&0x8000)!=0) {crc*=2; crc^=0x1021;}else crc*=2;if((*ptr&i)!=0) crc^=0x1021;}ptr++;}return(crc);}7、;CRC校验算法START EQU 2000H ;数据区首址(任意设置128字节数据)。
汇编语言文件的读写源代码
汇编语言文件的读写源代码一、概述汇编语言是一种低级语言,可以直接操作计算机的硬件资源。
在使用汇编语言编程时,文件的读写是非常常见的操作。
本文将介绍如何使用汇编语言进行文件的读写操作,并给出相应的源代码示例。
二、文件读取1. 打开文件在进行文件读取操作之前,首先需要打开待读取的文件。
以下是一个打开文件的汇编语言源代码示例:```assemblysection .datafilename db 'example.txt', 0mode db 'r', 0file dd 0section .textglobal _start_start:; 打开文件mov eax, 5mov ebx, filenamemov ecx, modeint 0x80mov [file], eax; ...```在上述示例中,首先定义了一个变量 `filename` 用于存储待读取文件的文件名,变量 `mode` 用于指定打开文件的模式。
然后使用系统调用 `int 0x80` 进行文件打开操作,并将返回的文件描述符保存在变量`file` 中。
2. 读取文件内容文件打开之后,就可以开始读取文件的内容了。
以下是一个读取文件内容的汇编语言源代码示例:```assemblysection .bssbuffer resb 1024section .text; ...; 读取文件内容mov eax, 3mov ebx, [file]mov ecx, buffermov edx, 1024int 0x80; ...```在上述示例中,定义了一个缓冲区变量 `buffer` 来存储读取的文件内容,并使用系统调用 `int 0x80` 进行文件读取操作。
读取的文件内容将被存储到缓冲区变量 `buffer` 中。
三、文件写入1. 创建文件在进行文件写入操作之前,有时需要先创建一个新的文件。
以下是一个创建文件的汇编语言源代码示例:```assemblysection .datafilename db 'output.txt', 0mode db 'w', 0file dd 0section .textglobal _start_start:; 创建文件mov eax, 8mov ebx, filenamemov ecx, modemov edx, 0777int 0x80mov [file], eax; ...```在上述示例中,首先定义了一个变量 `filename` 用于存储待创建文件的文件名,变量 `mode` 用于指定创建文件的模式。
汇编源代码
实验四用一般指令实现SSEG SEGMENT STACK ;定义堆栈段STK DB 20 dup(0);堆栈段有20字空间SSEG ENDS ;堆栈段结束DSEG SEGMENT ;定义数据段DA TA DB 110,160,80,45,200,100,50CNT DW 7MEGY DB ‘Y$’MEGN DB ‘N$’DSEG ENDS ;数据段结束CSEG SEGMENT ;定义代码段ASSUME DS:DSEG,CS:CSEGASSUME SS:SSEG,ES:ESEGSTART:MOV AX,DSEG ;建立DS段地址MOV DS,AXMOV ES,AXMOV AX,SSEGMOV SS,AXMOV SP,SIZE STKLEA DI,DA TAMOV CX,CNTCLDMOV AL,100LEA DX,MEGY ;把Y送入dxREPNZ SCASB ;如果没有和al里面100相等的数则重复搜索JZ DISP ;如果ZF标志位为1,则会进行跳转,直接输出dx内容LEA DX,MEGNDISP:MOV AH,9INT 21HMOV AH,4CHINT 21HCSEG ENDS ;代码段结束END START ;汇编结束,同时指明程序起始点用数据串指令实现SSEG SEGMENT STACK ;定义堆栈段STK DB 20 DUP(0);堆栈段有20字空间SSEG ENDS ;堆栈段结束DSEG SEGMENT ;定义数据段DA TA DB 100,1,2CNT DW 3MEGY DB ‘Y$’MEGN DB ‘N$’DSEG ENDSESEG SEGMENT ;定义附加段ESEG ENDSCSEG SEGMENT ;定义代码段ASSUME CS:CSEG,DS:DSEGASSUME SS:SSEG,ES:ESEGSTART: MOV AX,DSEG ;建立ds段地址MOV DS,AXMOV ES,AXMOV AX,SSEG ;建立ss段地址MOV SS,AX ;建立es段地址MOV SP,LENGTH STK ;设置堆栈指针MOV CX,WORD PTR CNTMOV DI,OFFSET DA TAMOV AL,100CLDXH: SCASBLEA DX,MEGYJE DISP ;数据串指令查找数据LOOP XH ;循环LEA DX,MEGN ;没有100,把N送入DL DISP: MOV AH,9INT 21HMOV AH,4CHINT 21HCSEG ENDSEND START实验五打印九九表SSEG SEGMENT STACK ;定义堆栈段DW 512 DUP(?)SSEG ENDS ;堆栈段结束DSEG SEGMENT ;定义数据段DSEG ENDSCSEG SEGMENT ;定义代码段ASSUME CS:CSEG,DS:DSEGASSUME SS:SSEGSTART:MOV AX,DSEG ;建立DS段地址MOV DS,AXMOV SS,AXMOV BL,1 ;初始被乘数为1MOV CH.9 ;设置外层循环次数CONTUNE:MOV CL,1 ;CL用于保存乘数HEREL:MOV DL,BL ;输出被乘数ADD DL,’0’ ;把数字转换为起所对应的ASCII 码以便正确显示MOV AH,02HINT 21HMOV DL,’*’ ;输出乘号MOV AH,02HINT 21HMOV DL,CL ;输出乘数ADD DL,’0’MOV AH,02HINT 21HMOV DL,’=’ ;输出等号MOV AH,02HINT 21HMOV AL,BLMUL CL ;进行乘法运算,运算结果保存在了AX中MOV BH,10 ;设置除数10,用于把十六进制数转换为十进制数DIV BHMOV DH,AHCMP AL,0 ;查看运算结果最高位是否为0JE HERE2 ;若高位为0,直接输出运算结果的低位ADD AL,’0’ ;输出高位MOV DL,ALMOV AH,02HINT 21HHERE2:ADD DH,’0’ ;输出低位MOV DL,DHMOV AH,02HINT 21HMOV DL,’ ‘ ;输出空格,用于算式之间的间隔MOV AH,02HINT 21HINC CL ;乘数加1CMP CL,BL ;比较乘数与被乘数是否相等JBE HERE1 ;乘数较小,继续内循环MOV DL,0DH ;回车MOV AH,02HINT 21HMOV DL,0AH ;换行MOV AH,02HINT 21HINC BL ;被乘数加1DEC CH ;计数器减1CMP CH,0 ;判断外循环是否循环完毕JA CONTUNE ;没有循环完毕,继续实验六DSEG SEGMENT ;数据段开始DA TA1 DB 01H,2CH,3DH ;加数存放单元DA TA2 DB 31H,0AH,9BHSUM DB 3 DUP(0) ;和存放单元LEN DW 3 ;数据长度DSEG ENDS ;数据段结束SSEG SEGMENT STACK ;堆栈段开始STK DB 20 DUP(0)SSEG ENDS ;堆栈段结束CSEG SEGMENT ;代码段开始ASSUME DS:DSEG,SS:SSEG,CS:CSEGSTART: MOV AX,DSEG ;初始化数据段基址MOV DS,AXMOV AX,SSEG ;初始化堆栈段基址MOV SS,AXLEA BX,DA TA1 ;取加数地址CALL SQR ;调用绝对子值程序LEA BX,DA TA2 ;取加数地址CALL SQR ;调用绝对子值程序CALL SSUM ;调用求和子程序MOV AH,4CHINT 21HSQR PROC ;绝对值子程序MOV DI,LENDEC DI ;取数据的最高位MOV AL,[BX+DI]TEST AL,80H ;判断最高位是否为0JZ POSTV ;为0时跳转MOV CX,LENDEC CX ;设置循环次数MOV AL,[BX]NOT AL ;对最低次进行处理ADD AL,1 ;取反后加1AGAIN: INC BX ;依次对各位进行处理MOV AL,[BX]NOT ALADC AL,0 ;取反后加上低位来的定位LOOP AGAINPOSTV: RETSQR ENDSSSUM PROC ;求多两字节数据之和的子程序LEA SI,DA TA1 ;取加数地址LEA DI,DA TA2LEA BX,SUM ;取和地址MOV CX,LEN ;取数据长度CLCADD0:MOV AL,[SI] ;多字节相加ADC AL,[DI]MOV [BX],ALINC SIINC DIINC BXLOOP ADD0RET ;返回SSUM ENDPCSEG ENDS ;代码段结束END START ;源程序结束。
汇编语言程序代码
BEGIN: MOV AH, 1 ;从键盘输入一个字符的 DOS 调用 INT 21H SUB AL, ‘0’ JB STOP ;输入字符<‘0’吗? CMP AL, 9 ;输入字符>‘9’吗? JA STOP CBW MOV CX, AX ;响铃次数 N JCXZ STOP BELL: MOV DL, 07H ;准备响铃 MOV AH, 2 ;显示一个字符的 DOS 调用,实际为响铃 INT 21H CALL DELAY100ms ;延时 100ms LOOP BELL STOP: RET 5.6 编写程序,将一个包含有 20 个数据的数组 M 分成两个数组:正数数组 P 和负数数组 N, 并分别把这两个数组中数据的个数显示出来。 答:程序如下:
SHR AX, CL ;右移四次 DEC CH JNZ A10 ;循环四次完了码? B10: MOV DL, STORE ;四组数分别放在 AL、BL、CL 和 DL 中 MOV CL, STORE+1 MOV BL, STORE+2 MOV AL, STORE+3 STOP: RET 5.4 试编写一程序,要求比较两个字符串 STRING1 和 STRING2 所含字符是否完全相同,若相 同则显示‘MATCH’,若不相同则显示‘NO MATCH’。 答:程序如下:
DSEG SEGMENT STORE DB 4 DUP (?) DSEG ENDS BEGIN: MOV CL, 4 ;右移四次 MOV CH, 4 ;循环四次 LEA BX, STORE A10: MOV DX, AX AND DX, 0FH ;取 AX 的低四位 MOV [BX], DL ;低四位存入 STORE 中 INC BX
CMP AL, 41H ;又<A 吗? JB INPUT ;不是‘A~F’的数重新输入 CMP AL, 46H ;>F 吗? JA INPUT ;不是‘A~F’的数重新输入 AND AL, 0FH ;转换为:1010B~1111B ADD AL, 9 BINARY: OR BL, AL ;将键盘输入的数进行组合 DEL CH JNZ INPUT DISPN: MOV CX, 16 ;将 16 位二进制数一位位地转换成 ASCII 码显示 DISP: MOV DL, 0 ROL BX, 1 RCL DL, 1 OR DL, 30H MOV AH, 2 ;进行显示 INT 21H LOOP DISP STOP: RET 代码转换; 查表法,实现一位 16 进制数转换为 ASCII 码显示
gcc编译汇编代码
GCC(GNU Compiler Collection)是一个开源的编译器集合,它支持多种编程语言,包括C、C++、Objective-C、Fortran、Ada、Go以及汇编语言等。
GCC 也可以用来编译汇编代码。
以下是一个简单的例子,说明如何使用GCC编译汇编代码:假设你有一个名为hello.s的汇编代码文件,内容如下:assembly复制代码.global _start_start:mov $0x01, %eaxmov $0x04, %ebxmov $0x01, %ecxlea msg, %edxmov $0x00, %esimov $0x0c, %alint $0x80mov $0x01, %eaxxor %ebx, %ebxint $0x80.section .datamsg:.ascii "Hello, world!\n"这是一个使用AT&T语法的x86汇编代码,用于在Linux上输出"Hello, world!"。
你可以使用GCC来编译这个汇编文件,并生成一个可执行文件:1.打开一个终端窗口。
2.切换到包含hello.s文件的目录。
3.运行以下命令来编译汇编代码:sh复制代码gcc -o hello hello.s -nostartfiles这个命令告诉GCC将hello.s编译成一个名为hello的可执行文件。
-nostartfiles选项告诉GCC不要链接任何启动文件,因为我们的汇编代码已经包含了必要的启动代码。
运行生成的可执行文件:sh复制代码./hello你应该会在终端窗口看到"Hello, world!"的输出。
汇编语言汇编程序从写出到最终执行的过程
汇编语言汇编程序从写出到最终执行的过程汇编语言是一种低级编程语言,可以直接操作计算机的硬件。
在编写汇编程序时,需要遵循一系列的步骤,包括编写源代码、汇编、链接和最终的执行。
下面将详细介绍汇编语言汇编程序的完整过程。
1. 编写源代码编写汇编程序的第一步是编写源代码。
汇编语言使用助记符(mnemonic)来代表机器指令,以及操作数和标签来表示数据和程序的地址。
源代码以文本文件的形式保存,其中包含汇编指令、数据和注释等。
汇编程序的源代码可以使用任何文本编辑器编写,如Notepad++、Sublime Text等。
2. 汇编完成源代码的编写后,需要将其转换为可执行的机器指令。
这一步骤称为汇编。
汇编器是一种软件工具,用于将汇编语言转换为机器码。
它会按照源代码中的指令格式和操作数,生成对应的二进制机器指令。
在汇编过程中,还会进行一些语法检查和错误提示,以确保指令的准确性和完整性。
3. 链接在汇编阶段,生成的机器指令是相对独立的,无法直接执行。
为了将不同的模块链接在一起,构建可执行文件,需要进行链接操作。
链接器是一种软件工具,用于将各个模块中的地址和引用解析,并生成最终的可执行文件。
链接器还负责解决模块间的依赖关系,将不同的模块适当地组合在一起。
4. 最终执行完成链接后,就可以将生成的可执行文件加载到计算机的内存中,并开始执行。
可执行文件中包含了汇编程序的机器指令,以及相关的数据。
计算机会按照指令序列的顺序,逐条执行汇编指令。
在执行过程中,数据会被加载到寄存器或内存中,并进行相应的运算和操作。
最终,汇编程序会产生预期的结果。
总结汇编语言汇编程序的从写出到最终执行的过程包括编写源代码、汇编、链接和最终执行。
编写源代码时,需要使用汇编语言的助记符、操作数和标签等。
汇编器负责将源代码转换为机器指令,并进行语法检查。
链接器将汇编程序的各个模块链接在一起,生成可执行文件。
最终,计算机加载可执行文件并执行其中的机器指令,完成汇编程序的执行。
源代码VS汇编代码VS目标代码VS字节码VS机器码
源代码VS汇编代码VS⽬标代码VS字节码VS机器码1、源代码(source code)源代码就是平时我们开发的代码;⽐如C、Java、Python、Shell...等public class HelloWorld {public static void main(String []args) {System.out.println("Hello World");}}2、汇编代码(Assembly code)汇编语⾔也是⼈看的懂的语⾔,也是源码#hello.s.data # 数据段声明msg : .string "Hello, world!\\n" # 要输出的字符串len = . - msg # 字串长度.text # 代码段声明.global _start # 指定⼊⼝函数_start: # 在屏幕上显⽰⼀个字符串movl $len, %edx # 参数三:字符串长度movl $msg, %ecx # 参数⼆:要显⽰的字符串movl $1, %ebx # 参数⼀:⽂件描述符(stdout)movl $4, %eax # 系统调⽤号(sys_write)int $0x80 # 调⽤内核功能# 退出程序movl $0,%ebx # 参数⼀:退出代码movl $1,%eax # 系统调⽤号(sys_exit)int $0x80 # 调⽤内核功能3、⽬标代码(object code)⽬标代码是由编译器或其他转换器⽣成的代码,包括机器码、字节码等4、字节码(Bytecode)字节码是由编译器⽣成的中间语⾔,⽣成中间语⾔后由运⾏时环境解释或即时编译。
它通常不是⼈类可读的语⾔,也不代表在任何现有CPU 硬件上直接执⾏的实际机器语⾔。
5、可执⾏⽂件(Excuteable file)链接过程的产物。
它们是可以由CPU直接执⾏的机器码。
6、库⽂件(Library file)可能很多地⽅要⽤到这个,⽣成库⽂件,⽅便多个地⽅使⽤。
汇编语言源程序的运行过程
汇编语言源程序的运行过程汇编语言是一种低级别的编程语言,它与计算机硬件直接相关。
它通常被用于编写硬件驱动程序、嵌入式系统和最底层的操作系统等。
下面是汇编语言源程序的运行过程,涵盖了编译、链接、装载和执行等主要步骤。
1.编写源代码:汇编语言程序通常由汇编指令和伪指令组成。
汇编指令是一种与机器指令对应的易于阅读和理解的符号表示方式。
伪指令是一种用于声明和初始化变量、存储常量以及定义程序控制结构的特殊指令。
2.编译:汇编语言源代码需要通过汇编器进行编译,将其转换成机器可执行的目标代码。
汇编器将汇编指令转换成机器码,并生成与每条指令对应的目标代码。
3.链接:汇编语言源程序中可能会引用一些外部的函数或库。
在链接阶段,连接器将目标代码和外部函数的实现链接在一起,形成最终的可执行文件。
链接的目的是解决程序中的符号引用,保证被引用的函数能被正确执行。
4.装载:在执行之前,操作系统需要将可执行文件装载到内存中。
装载器会通过分析可执行文件的结构,并将代码、数据和栈等部分装入合适的内存位置,以便程序能够正常运行。
5.执行:装载后,汇编语言程序开始执行。
CPU从程序的入口地址开始执行第一条指令。
指令由操作码和操作数组成,操作码用于指示要执行的操作类型,操作数则提供了相关的数据。
依次执行每条指令,程序按照预定的算法和逻辑运行。
在执行过程中,程序可能需要和外部设备或其他软件交互,具体的输入和输出操作会通过中断和系统调用等机制进行。
中断可以触发特定的处理程序,用于处理硬件设备的输入输出或异常情况的处理。
系统调用允许程序通过操作系统提供的功能来进行输入输出、内存管理和进程调度等操作。
总的来说,汇编语言源程序的运行过程包括编写源代码、编译、链接、装载和执行。
这个过程关系到程序从开发到运行的相关步骤,每个步骤都需要严格的处理,以确保程序能够正确运行,并与外部环境进行良好的交互。
51单片机模拟I2C总线的汇编源代码
NOP
NOP
NOP
NOP
NOP
NOP
NOP
CLR SCL
NOP
NOP
NOP
NOP
NOP
SJMP WLP1
;启动IIC总线子程序
START:SETB SDA
NOP
NOP
SETB SCL ;起始条件建立时间大于4.7us
NOP
NOP
NOP
NOP
NOP
CLR SDA ;起始条件锁定大于4us
NOP
SETB SCL ;结束总线时间大于4us
NOP
NOP
NOP
NOP
NOP
SETB SDA ;结束总线
NOP ;保证一个终止信号和起始信号的空闲时间大于4.7us
NOP
RET
;发送字节子程序
;字节数据放入ACC
;每发送一个字节调用一次CACK子程序,取应答位
WRBYTE: MOV R0,#08H
WLP: RLC A ;取数据位
JC WR1
SJMP WR0 ;判断数据位
NOP
NOP
NOP
NOP
CLR SCL
NOP
NOP
NOP
NOP
NOP
SJMP WLP1
IWRNBYTE1:LCALL STOP
IWRNBYTE:LCALL START ;启动总线
MTD EQU 32H ;发送的数据
ORG 0000H
LJMP MAIN
;延时子程序,12M,125mS秒
DELAY:MOV R6,#00H
单片机模拟pt2272解码12路遥控器用tp2264编码的汇编源代码有详细注释
民用315M调制频率下,单片机模拟解码芯片2272工作中需要控制12个开关。
而且要遥控的。
就想到了通用的315M传输模块。
市场上只有少见的多路无线遥控。
找到一个设计很巧妙的12路无线遥控发射和接收模块。
拆开一看,原来如此发射模块用2264芯片,8位地址码,每位地址有3种状态(高电平,低电平,悬空),共3^8(65535)种地址,4位数据码,每个数据3种状态(共12种状态)。
只不过一般2272解码芯片把悬空状态和低电平等同。
输出4个开关状态(每个开关有高电平和低电平2种状态)。
综合上述,2264芯片其实每发送一帧编码,可以有3^12(531441)种帧编码。
也就是说。
我们不用2272解码芯片,而是用单片机解码,其实就可以实现8位地址(65535种)码,和12种数据,然后扩展控制12个动作。
这就是12路遥控的原理。
我在网上查了一下汇编源代码所有的源代码都是一个。
注释比较少。
我就自己写了一个,实际调试也成功了。
现在将代码共享如下。
STC单片机用的是4052AD,12M晶振,原因是计时器是1um的。
比较好算一点。
呵呵。
以下是源代码,复制编译即可。
接收模块接P1.7引脚。
;=================================================;STC单片机。
本人用了很多该单片机,最多的是STC12c4052AD这款;接收模块,315M,发射端用PT2264调制震荡电阻式1.2M的,电阻标示125;网上只搜索到一个汇编程序,注释比较少。
所以我调试成功之后写了一个;我在应用过程中硬件调试成功。
实际测得窄脉冲为100um左右,宽脉冲在300um左右,同步位低电平为3800um左右;遥控器有12个案件。
是市场上比较少见的。
一般2272解码后,4路输出,把悬空和0做相同处理;遥控器可以发出12种状态,4路(每路有0,1,悬空三种状态)故共12种状态。
这个遥控器设计比较巧妙。
接收只能用单片机实现,输出12种状态;程序调试通过。
常见汇编程序源代码示例
包含14个常见的汇编程序源代码,所有代码在VC6.0中调试通过;汇编程序釆用《微机原理接口与技术》(钱晓婕)一书中所用的框架。
目录1.编写程序,计算下面函数的值并输出。
(2)2.输入一个年份(调用readuid子程序),判断是否是闰年 (2)3.输入三个无符号整数(调用readuid子程序),判断并输出这三个数是否能构成一个三角形的三条边。
若这三个数能构成一个三角形的三条边,输出三角形的形状:斜三角形、等腰三角形、等边三角形。
(3)4.采用无条件和条件转移指令构造while和do while循环结构,完成下面的求和任务并输出sum(sum为双字)。
(5)5.编写程序,求0到100间所有偶数和并输出。
要求采用loop、while# do while三种不同的循环结构完成。
(6)6.Fibonacci numbers 的定义: (8)fl=l,f2=l z fn= fn-1 + fn-2 n>=3 (8)编程输出Fibonacci numbers的前30 项。
(8)7.有一个首地址为array的20个有符号的双字数组,编程分别求出正数的和与负数的和并输出。
(10)8.有一个首地址为string的字符串,剔除string中所有的空格字符。
请从字符串最后一个字符开始逐个向前判断、并进行处理。
(12)9.有一个首地址为string的字符串,分别统计string中空格、英文字母、数字和其它字符的个数并输出。
(13)10.palindrome(回文)是指正读和反读都一样的数或文本。
例如:11、121. 12321 等,编写程序,求10到10000之间所有回文数并输出。
要求每行输出10个数。
1511.编写程序,求出所有满足勾股定理且边长不大于500的直角三角形。
.1712.编写一个求n!的子程序,利用它求1 !+2!+引+4!+5!+6!+7!+8!的和并输出。
2213.编写一个判断闰年的子程序,利用它求出2010年到2060年之间所有的闰年并输出。
汇编语言加减乘除四则运算实现源代码.
汇编语言加减乘除四则运算实现源代码汇编语言加减乘除四则运算实现源代码 MOVBX,AX POP AX DIV CX PUSH DX MOV DX,BX OR BX,AX JNZ DOUT1DOUT2: POP AX ADDAL,'0' CMP AL,'9' JBEDOUT3 ADD AL,'A'-'9'-1DOUT3: CALLDISP DEC BP JNZ DOUT2 POP BP POP DX POP BX POPAX RET;输入数据在DX:AX中返回;CX=0 数据为10进制;CX#0 数据为16进制DATE LABEL NEAR PUSHBX PUSH BP PUSH DI XOR AX,AX XOR DX,DXDATE1: MOVDI,AX LODSB CMP AL,'0' JB DATE7 CMP AL,'9' JA SHL DI,1 RCL DX,1 SHL DI,1 RCL DX,1 JCXZ DATE3 SHLDI,1 RCL DX,1 Jmp shortDATE4DATE3: ADD DI,BX ADCDX,BPDATE4: ADD AX,DI ADCDX,0 JMP DATE1DATE5: ADDAL,9 JMP DATE2DATE6: JCXZDATE7 CMP AL,'A' JBDATE7 CMP AL,'F' JBEDATE5 CMP AL,'a' JBDATE7 CMP AL,'f' JBEDATE5DATE7: MOV AX,DI DECSI OR DI,DX POP DI POPBP POP BX RET;数据1与数据2根据YSF1进行加减运算JSJJ LABEL NEAR MOVAX,NUM2 MOV DX,NUM2+2 CMPYSF1,'+' JZ JSJJ1 SUBNUM1,AX SBB NUM1+2,DX JMP SHORTJSJJ2JSJJ1: ADD NUM1,AX ADC NUM1+2,DX上一页[1] [2] [3] 下一页。
汇编 编译 c语言 编译器源码
汇编编译 c语言编译器源码汇编语言是一种底层的计算机语言,它通常用来编写对计算机硬件直接操作的程序。
而C语言则是一种高级编程语言,可以用来编写更加复杂和灵活的程序。
在编写C语言程序时,常常需要使用编译器来将源代码转换成可以直接在计算机上运行的机器语言程序。
下面我们介绍一下如何使用汇编语言编写一个C语言编译器的源代码。
首先,需要了解编译器的基本原理。
编译器通常分为三个主要部分:词法分析、语法分析和代码生成。
词法分析器负责将原始的源代码分割成一个个的“单词”,并将这些单词转换为计算机可以识别的“符号”。
语法分析器则负责将这些符号组合成更为复杂的语句和表达式,最终生成一个抽象语法树(AST)。
代码生成器则负责将这个抽象语法树转换为可以在计算机上运行的机器代码。
接下来,以x86汇编语言为例,展示代码实现的步骤。
在x86汇编中,常用的指令包括MOV、ADD、SUB、JMP等。
为了实现上述三个部分,我们需要使用一些特殊的指令来处理源代码。
首先,我们需要编写一个词法分析器,它可以将源代码分割成一个个的单词,并将这些单词转换为对应的符号。
这个过程中,我们可以使用字符串处理的指令,如MOV、ADD、SUB等。
将每个单词保存在内存中,并通过指针操作来移动到下一个单词。
其次,我们需要编写一个语法分析器,它可以将符号组合成更复杂的语句和表达式,最终生成一个抽象语法树(AST)。
这个过程中,我们需要使用一些特殊的指令来处理不同类型的语句,如条件语句、循环语句等。
通过将语法树保存在内存中,并使用指针操作来访问不同节点,实现对语法树的遍历和处理。
最后,我们需要编写一个代码生成器,它可以将抽象语法树转换为可以在计算机上运行的机器代码。
这个过程中,我们需要使用一些特殊的指令来实现不同类型的操作,如算术运算、逻辑运算、函数调用等。
通过将生成的机器代码保存在内存中,并使用指针操作来将代码写入文件或执行程序。
总结来说,汇编语言可以用来编写C语言编译器的源代码,通过编写词法分析器、语法分析器和代码生成器,实现将C语言源代码转换为可以在计算机上运行的机器代码。
Linux下反汇编分析C语言源代码
Linux下反汇编分析C语⾔源代码Linux下反汇编分析C语⾔源代码by 赵缙翔原创作品转载请注明出处这是我第⼀次写的博客,如有疏漏,还请指教。
在上完孟宁⽼师的软件⼯程课程后,觉得这⽼师的课真⼼不错,就⼜选了他的Linux内核分析。
因为Linux内核代码中还是有⼀些C语⾔没法做的事情需要At&T汇编代码来帮忙,所以我们需要了解⼀些汇编的常识。
汇编基础命名习惯的历史由来最先开始,Intel 8086和8088有⼗四个16位寄存器,⽐如AX, BX, CX, DX等等。
然后Intel出了32位处理器,相对于16位处理器是是扩展的(extended),于是在16位的寄存器基础上加上E前缀,⽐如AX变成了EAX,在后来,AMD出了64位处理器,采⽤的R前缀,具体为什么⽤R,我也不造啊,求告诉。
常⽤的寄存器(有汇编基础的应该很好懂……我学过单⽚机的汇编,竟然也看懂了⼤部分。
so,我就不赘述了,摘抄⾃)Although the main registers (with the exception of the instruction pointer) are "general-purpose" in the 32-bit and 64-bit versions of the instruction set and can be used for anything, it was originally envisioned that they be used for the following purposes: AL/AH/AX/EAX/RAX: AccumulatorBL/BH/BX/EBX/RBX: Base index (for use with arrays)CL/CH/CX/ECX/RCX: Counter (for use with loops and strings)DL/DH/DX/EDX/RDX: Extend the precision of the accumulator (e.g. combine 32-bit EAX and EDX for 64-bit integeroperations in 32-bit code)SI/ESI/RSI: Source index for string operations.DI/EDI/RDI: Destination index for string operations.SP/ESP/RSP: Stack pointer for top address of the stack.BP/EBP/RBP: Stack base pointer for holding the address of the current stack frame.IP/EIP/RIP: Instruction pointer. Holds the program counter, the current instruction address.Segment registers:CS: CodeDS: DataSS: StackES: Extra dataFS: Extra data #2汇编指令由于是我们使⽤的32位的汇编指令,所以有个l前缀,还有,和51单⽚机的堆栈不同,这⾥的堆栈是从⾼向低⼊栈的……还有⼀个问题就摘抄吧,他说得很好AT&T格式和intel格式,这两种格式GCC是都可以⽣成的,如果要⽣成intel格式的汇编代码,只需要加上-masm=intel选项即可,但是Linux下默认是使⽤AT&T格式来书写汇编代码,Linux Kernel代码中也是AT&T格式,我们要慢慢习惯使⽤AT&T格式书写汇编代码。
汇编语言程序代码
MOV(MOVe)传送指令PUSH 入栈指令POP 出栈指令XCHG(eXCHanG)交换指令XLAT(TRANSLATE)换码指令LEA (Load Effective Address)有效地址送寄存器指令LDS(Load DS with pointer)指针送寄存器和DS指令LES(Load ES with pointer)指针送寄存器和ES指令LAHF(Load AH with Flags)标志位送AH指令SAHF(Store AH into Flgs) AH送标志寄存器指令PUSHF(PUSH the Flags)标志进栈指令POPF(POP the Flags)标志出栈指令ADD 加法指令ADC 带进位加法指令INC 加1指令SUB(SUBtract)不带借位的减法指令SBB(SuVtrach with borrow)带借位的减法指令DEC(DECrement)减1指领NEG(NEGate)求补指令CMP(CoMPare)比较指令MUL(unsinged MULtiple)无符号数乘法指令IMUL(sIgned MUL tiple)有符号数乘法指令DIV(unsigned DIVide)无符号数除法指令IDIV(sIgned DIVide)有符号数除法指令CBW(Count Byte to Word)字节转换为字指令CWD(Count Word to Doble word)字转换为双字指令DAA 压缩的BCD码加法十进制调整指令DAS 压缩的BCD码减法十进制调整指令AAA 非压缩的BCD码加法十进制调整指令AAS 非压缩的BCD码加法十进制调整指令AND 逻辑与指令OR 逻辑或指令XOR 逻辑异或指令NOT 逻辑非指令TEST 测试指令SHL(SHift logical Letf)逻辑左移指令SHR(SHift logical Right)逻辑右移指令ROL(Rotate Left )循环左移指令ROR(Rotate Right)循环右移指令RCL(Rotate Left through Carry)带进位循环左移RCR(Rotate Right through Carry)带进位循环左移MOVS(MOVe String)串传送指令STOS(STOre into String)存入串指令LODS(LOad from string)从串取指令REP(REPeat)重复操作前缀P61CLD(CLear Direction flag)清除方向标志指令STD(SeT Direction flag)设置方向标志指令CMPS(CoMPare String)串比较指令SCAS(SCAn String)串扫描指令REPE/REPZ(REPeat while Equal/Zero)相等/为零时重复操作前缀REPNE/REPNZ(REPeat while Not Equal/Zero)不相等/不为零进重复前缀IN(INput)输入指令OUT(OUTput)输出指令JMP(JuMP)无条件转移指令JZ,JNZ,JS,JNS,JO,JNO,JP,JNP,JB,JNB,JBE,JNBE,JL,JNL,JLE,JNLE,JCXZ 条件转移指令LOOP 循环指令LOOPZ/LOOPE 为零/相等时循环指令LOOPNZ/LOOPNE 不为零/不相等时循环指令CALL 子程序调用指令RET(RETun)子程序返回指令CLC(CLear Carry)进位位置0指令CMC(CoMplement Carry)进位位求反指令SRC(SeT Carry)进位位置1指令NOP(No OPeretion)无操作指令HLT(HaLT)停机指令OFFSET 返回偏移地址SEG 返回段地址EQU(=)等值语句PURGE 解除语句DUP 操作数字段用复制操作符SEGMENT,ENDS 段定义指令ASSUME 段地址分配指令ORG 起始偏移地址设置指令$ 地址计数器的当前值PROC,ENDP 过程定义语句NAME,TITLE,END 程序开始结束语句MACRO,ENDM 宏定义指令P99。
汇编语言源程序的编辑汇编连接的方法
汇编语言源程序的编辑汇编连接的方法1. 使用正确的扩展名:源代码文件应该使用与汇编器兼容的扩展名,如.asm或.s。
2.引入必要的库:根据程序的需求,可能需要引入一些预编译库,在源代码中使用相应的指令或宏。
3.编写注释:在源代码中添加注释,以便于其他人阅读和理解代码的功能和逻辑。
二、汇编源程序:汇编是将源代码转换为机器码的过程。
在进行汇编之前,需要使用专门的汇编器将源程序转换为可执行文件。
最常用的汇编器是GNU Assembler (GAS),它通常与GCC工具链一起使用。
下面是执行汇编的步骤:1. 打开命令行界面:需要进入一个命令行终端,如Windows的CMD或Linux的终端。
2. 切换工作目录:使用cd命令在命令行中进入源代码所在的目录。
例如,如果源代码文件位于C:\Programs目录中,可以使用以下命令:cd C:\Programs。
3. 使用汇编器:执行汇编器的命令,将源代码转换为目标文件。
以下是一个示例命令:gcc -c program.asm -o program.o。
这个命令使用GCC编译器调用GNU Assembler (GAS)进行汇编,并将输出的目标文件保存为program.o。
在进行汇编时,可能需要注意以下几点:1.确保安装了汇编器:确保系统中安装了汇编器,如GAS,并且其可执行文件所在的目录已添加到系统的环境变量中。
2.处理错误和警告:在进行汇编时,可能会出现错误和警告。
需要仔细阅读汇编器输出的信息,并进行相应的修正。
三、连接目标文件:连接是将目标文件与所需的库文件合并为一个可执行文件的过程。
在连接之前,需要使用链接器将目标文件与库文件进行关联。
最常用的链接器是GNU链接器 (ld),它也通常与GCC工具链一起使用。
以下是执行连接的步骤:1. 打开命令行界面:需要进入一个命令行终端,如Windows的CMD或Linux的终端。
2. 切换工作目录:使用cd命令在命令行中进入目标文件所在的目录。
汇编语言程序运行步骤
汇编语言程序运行步骤汇编语言是一种低级程序设计语言,用于编写计算机的指令集。
在使用汇编语言编写程序时,需要经历一系列的步骤,从编辑源代码到最终的程序运行。
本文将详细介绍汇编语言程序的运行步骤。
步骤一:编辑源代码汇编语言程序的第一步是编辑源代码。
在该步骤中,我们使用文本编辑器来编写程序的源代码。
源代码是由汇编语言指令和标识符(变量、常量等)组成的文本文件。
在编辑源代码时,我们需要遵循特定的格式和语法规则。
这些规则包括指令的书写方式、操作数的类型和顺序、标识符的命名规则等。
通过正确编写源代码,我们可以确保程序的正确性和可读性。
步骤二:汇编源代码编辑完成源代码后,我们需要将其转换为机器可执行的形式。
这一步骤称为汇编,它将汇编语言指令翻译为机器指令。
在进行汇编时,我们使用汇编器(Assembler)来执行。
汇编器读取源代码文件,将其中的指令和标识符转换为对应的二进制表示形式。
同时,汇编器还会对程序中的语法和语义错误进行检查,并生成相应的错误提示。
经过汇编的源代码将生成目标文件,其中包含了机器指令的二进制表示以及其他必要的信息(如数据段、代码段等)。
目标文件通常具有.obj、.o或.exe等扩展名。
步骤三:链接目标文件在汇编语言程序中,我们通常会使用外部的库函数或模块。
为了让程序能够调用这些外部资源,我们需要将目标文件与这些资源进行链接。
链接的主要任务是解析目标文件中的符号引用,并将其与相应的符号定义进行关联。
符号可以是函数、变量或常量等。
通过链接,我们可以确保程序能够正确地调用外部资源,实现所需的功能。
在进行链接时,我们使用链接器(Linker)来执行。
链接器读取所有需要链接的目标文件,对符号进行解析和关联,生成最终的可执行文件。
可执行文件是一个可以直接运行的二进制文件,其中包含了完整的机器指令和数据。
步骤四:加载和运行程序在链接完成后,我们需要将可执行文件加载到计算机的内存中,并执行其中的指令。
这一步骤称为加载和运行。
单片机流水灯汇编语言源代码大全(六款流水灯汇编语言源代码)
ORG 0
MOV R1,#3
LOOP1:MOV R0,#8
MOV A,#11111110B
LOOP2:MOV P0,A
RL A
CALL D200MS
DJNZ R0,LOOP2
DJNZ R1,LOOP1
MOV A,#00000000B
MOV P0,A
MOV P2,#0FFH
LOOP:MOV A,P2
ORG 0000H
JMP main
ORG 0003H
JMP int_0
main:
SETB IT0
SETB EX0
SETB EA
MOV A,#11111110B
s:RL A
MOV P2,A
CALL delay
JMP s
delay:
MOV R7,#100
d3:MOV R6,#200
d2:MOV R5,#250
ORG 0000H
MOV R0,#11111110B
start:MOV A,#11111110B
MOV P2,A
s:CALL delay
RL A
MOV P2,A
CALL delay
CJNE A,#01111111B,s
MOV A,R0
MOV P1,A
RL A
MOV R0,A
JMP start
delay:MOV R5,#100
CPL A
MOV P0,A
JMP LOOP
D200MS:
MOV R7,#250
D1:MOV R6,#200
D2:MOV R5,#2
DJNZ R5,$
DJNZ R6,D2
DJNZ R7,D1
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验四
用一般指令实现
SSEG SEGMENT STACK ;定义堆栈段
STK DB 20 dup(0);堆栈段有20字空间
SSEG ENDS ;堆栈段结束
DSEG SEGMENT ;定义数据段
DA TA DB 110,160,80,45,200,100,50
CNT DW 7
MEGY DB ‘Y$’
MEGN DB ‘N$’
DSEG ENDS ;数据段结束
CSEG SEGMENT ;定义代码段
ASSUME DS:DSEG,CS:CSEG
ASSUME SS:SSEG,ES:ESEG
START:
MOV AX,DSEG ;建立DS段地址
MOV DS,AX
MOV ES,AX
MOV AX,SSEG
MOV SS,AX
MOV SP,SIZE STK
LEA DI,DA TA
MOV CX,CNT
CLD
MOV AL,100
LEA DX,MEGY ;把Y送入dx
REPNZ SCASB ;如果没有和al里面100相等的数则重复搜索
JZ DISP ;如果ZF标志位为1,则会进行跳转,直接
输出dx内容
LEA DX,MEGN
DISP:
MOV AH,9
INT 21H
MOV AH,4CH
INT 21H
CSEG ENDS ;代码段结束
END START ;汇编结束,同时指明程序起始点
用数据串指令实现
SSEG SEGMENT STACK ;定义堆栈段
STK DB 20 DUP(0);堆栈段有20字空间
SSEG ENDS ;堆栈段结束
DSEG SEGMENT ;定义数据段
DA TA DB 100,1,2
CNT DW 3
MEGY DB ‘Y$’
MEGN DB ‘N$’
DSEG ENDS
ESEG SEGMENT ;定义附加段
ESEG ENDS
CSEG SEGMENT ;定义代码段
ASSUME CS:CSEG,DS:DSEG
ASSUME SS:SSEG,ES:ESEG
START: MOV AX,DSEG ;建立ds段地址
MOV DS,AX
MOV ES,AX
MOV AX,SSEG ;建立ss段地址
MOV SS,AX ;建立es段地址
MOV SP,LENGTH STK ;设置堆栈指针
MOV CX,WORD PTR CNT
MOV DI,OFFSET DA TA
MOV AL,100
CLD
XH: SCASB
LEA DX,MEGY
JE DISP ;数据串指令查找数据
LOOP XH ;循环
LEA DX,MEGN ;没有100,把N送入DL DISP: MOV AH,9
INT 21H
MOV AH,4CH
INT 21H
CSEG ENDS
END START
实验五打印九九表
SSEG SEGMENT STACK ;定义堆栈段
DW 512 DUP(?)
SSEG ENDS ;堆栈段结束
DSEG SEGMENT ;定义数据段
DSEG ENDS
CSEG SEGMENT ;定义代码段
ASSUME CS:CSEG,DS:DSEG
ASSUME SS:SSEG
START:
MOV AX,DSEG ;建立DS段地址
MOV DS,AX
MOV SS,AX
MOV BL,1 ;初始被乘数为1
MOV CH.9 ;设置外层循环次数
CONTUNE:
MOV CL,1 ;CL用于保存乘数
HEREL:
MOV DL,BL ;输出被乘数
ADD DL,’0’ ;把数字转换为起所对应的ASCII 码以便正确显示
MOV AH,02H
INT 21H
MOV DL,’*’ ;输出乘号
MOV AH,02H
INT 21H
MOV DL,CL ;输出乘数
ADD DL,’0’
MOV AH,02H
INT 21H
MOV DL,’=’ ;输出等号
MOV AH,02H
INT 21H
MOV AL,BL
MUL CL ;进行乘法运算,运算结果保存在了AX中
MOV BH,10 ;设置除数10,用于把十六进制数转换为十进制数
DIV BH
MOV DH,AH
CMP AL,0 ;查看运算结果最高位是否为0
JE HERE2 ;若高位为0,直接输出运算结果的低位
ADD AL,’0’ ;输出高位
MOV DL,AL
MOV AH,02H
INT 21H
HERE2:
ADD DH,’0’ ;输出低位
MOV DL,DH
MOV AH,02H
INT 21H
MOV DL,’ ‘ ;输出空格,用于算式之间的间隔
MOV AH,02H
INT 21H
INC CL ;乘数加1
CMP CL,BL ;比较乘数与被乘数是否相等
JBE HERE1 ;乘数较小,继续内循环
MOV DL,0DH ;回车
MOV AH,02H
INT 21H
MOV DL,0AH ;换行
MOV AH,02H
INT 21H
INC BL ;被乘数加1
DEC CH ;计数器减1
CMP CH,0 ;判断外循环是否循环完毕JA CONTUNE ;没有循环完毕,继续
实验六
DSEG SEGMENT ;数据段开始
DA TA1 DB 01H,2CH,3DH ;加数存放单元
DA TA2 DB 31H,0AH,9BH
SUM DB 3 DUP(0) ;和存放单元
LEN DW 3 ;数据长度
DSEG ENDS ;数据段结束
SSEG SEGMENT STACK ;堆栈段开始
STK DB 20 DUP(0)
SSEG ENDS ;堆栈段结束
CSEG SEGMENT ;代码段开始
ASSUME DS:DSEG,SS:SSEG,CS:CSEG
START: MOV AX,DSEG ;初始化数据段基址
MOV DS,AX
MOV AX,SSEG ;初始化堆栈段基址
MOV SS,AX
LEA BX,DA TA1 ;取加数地址
CALL SQR ;调用绝对子值程序
LEA BX,DA TA2 ;取加数地址
CALL SQR ;调用绝对子值程序
CALL SSUM ;调用求和子程序
MOV AH,4CH
INT 21H
SQR PROC ;绝对值子程序
MOV DI,LEN
DEC DI ;取数据的最高位
MOV AL,[BX+DI]
TEST AL,80H ;判断最高位是否为0
JZ POSTV ;为0时跳转
MOV CX,LEN
DEC CX ;设置循环次数
MOV AL,[BX]
NOT AL ;对最低次进行处理
ADD AL,1 ;取反后加1
AGAIN: INC BX ;依次对各位进行处理
MOV AL,[BX]
NOT AL
ADC AL,0 ;取反后加上低位来的定位
LOOP AGAIN
POSTV: RET
SQR ENDS
SSUM PROC ;求多两字节数据之和的子程序LEA SI,DA TA1 ;取加数地址
LEA DI,DA TA2
LEA BX,SUM ;取和地址
MOV CX,LEN ;取数据长度
CLC
ADD0:MOV AL,[SI] ;多字节相加ADC AL,[DI]
MOV [BX],AL
INC SI
INC DI
INC BX
LOOP ADD0
RET ;返回SSUM ENDP
CSEG ENDS ;代码段结束END START ;源程序结束。