
汇编语言篇
fulinux
我热爱Linux、热爱Yocto、喜欢编程、热爱科学技术的码农!希望我的博客能帮助到哪些在茫茫黑夜中摸索的小白!
欢迎关注、点赞和订阅!
展开
-
标志位寄存器的说明
一、运算结果标志位1、进位标志CF(Carry Flag)进位标志CF主要用来反映运算是否产生进位或借位。如果运算结果的最高位产生了一个进位或借位,那么,其值为1,否则其值为0。使用该标志位的情况有:多字(字节)数的加减运算,无符号数的大小比较运算,移位操作,字(字节)之间移位,专门改变CF值的指令等。2、奇偶标志PF(Parity Flag)奇偶标志PF用于反映运转载 2012-11-26 20:43:12 · 3094 阅读 · 0 评论 -
iret指令
好像中断返回都用到iret,因为要返回标志位,call返回用的是ret原创 2012-12-11 15:00:29 · 3259 阅读 · 0 评论 -
repne指令和scasb指令解析
extern inline int strlen(const char * s){register int __res__asm__('cx');__asm__("cld\n\t" "repne\n\t" "scasb\n\t" "notl %0\n\t" "decl %0" :"=c"(__res):"D"(s),"a"(0),"0"(0xffffffff):"di");ret原创 2012-12-13 11:08:22 · 16493 阅读 · 0 评论 -
嵌入汇编中的编号解析
嵌入如汇编程序规定把输出和输入寄存器统一按顺序编号,顺序是从输出寄存器序列从左到右从上到下以“%0”开始,分别记为%0,、%1、。。。%9。因此下面的中的%4对应“1”(0),而“1”(0)有对应“=d”(__res)#define do_div(n,base)({\int __res;\__asm__("divl %4":"=a"(n),"=d"(_res):"0"(n),"1"(0原创 2012-12-13 13:15:48 · 2087 阅读 · 2 评论 -
回车和换行的区别-\n\r什么意思呢?
回车和换行的区别原创 2012-12-13 16:36:51 · 2402 阅读 · 0 评论 -
MOV PC, LR解析
MOV PC, LR如果在子程序中LR没有改变,则等同于 RET程序在 调用子程序时,会把 BL SUB_XXXXX 处的下一条指令送入 LR, 这样,当所调用的子程序没有改变LR的值时(注意这里我说说的是在整个子程序中LR没有被改变),返回父程序时,你就可以使用 MOV PC, LR;==============这一段代码完成从NAND Flash读原创 2012-12-13 18:57:37 · 8566 阅读 · 0 评论 -
关于mrc p15,0,r0,c1,c0,0
mrc是协处理器命令。用于读取协处理器中的寄存器的数据到ARM处理器的寄存器里面。mrc p15,0,r0,c1,c0,0 这句话的意思应该是读协处理器中的寄存器数据到ARM处理器的r0里面。应该是ARM访问MMU,一般cp15就是MMU。{cond} p#, ,Rd,cn,cm{, }MRC 从协处理器移到ARM7寄存器(L=1)MCR 从ARM7寄存器移到协处理器(L=0)转载 2012-12-14 21:03:16 · 7364 阅读 · 0 评论 -
ARM协处理器
ARM920T协处理器接口ARM920T处理器通过一个外部协处理器接口来支持连接片上协处理器。ARM处理器支持所有的协处理器指令。ARM920T协处理器接口允许你附加一个专门设计的协处理器到ARM920T。包括:1.附加一个加速器:用于浮点运算,DSP,3-D图形,加密解密。2.ARM指令集可支持连接多达16个协处理器到ARM处理器,编号为0~15内部协处理器ARM920T转载 2012-12-14 22:06:35 · 1422 阅读 · 0 评论 -
INTR和INTE的区别
INTR——中断请求信号,高电平有效 8255A输出的信号,可用于向CPU提出中断请求,要求CPU读取外设数据INTE ——中断允许信号,高电平有效 用于控制中断允许或中断屏蔽原创 2012-12-29 16:41:16 · 8633 阅读 · 0 评论 -
andl $size-1,%ecx
andl $size-1,%ecx这里的size是1024即下面的语句andl $1023,%ecx即andl $111111111111b,%ecx凡是超出12位的自动把12位的上的值清零,第十二位的数值不受影响很聪明原创 2012-12-18 15:05:25 · 1531 阅读 · 0 评论 -
addb %al,%al
keyboard.S中:假如al中第2和4位为1其余位为0,则下面的语句执行后al中位3和5为1其余位为0addb %al,%al很聪明!!!!原创 2012-12-18 15:19:30 · 3759 阅读 · 0 评论 -
bsfl ecx,ecx
bsfl ecx,ecx # 从低位(0位)开始扫描位图,看是否有1 的位,若有,则ecx保留该为的偏移值(即地址位0--31)。原创 2013-01-16 13:54:36 · 1254 阅读 · 0 评论 -
ARM非向量中断初始化程序和向量初始化程序
;********************************************************;* NAME : 44BINIT.S *;* Version : 10.April.2000 *;* Description: *;* C start up codes *;* Configu原创 2013-01-17 19:43:20 · 1717 阅读 · 0 评论 -
lss _stack_start,%esp
LEA reg,memmem有效地址->regLDS reg,memmem低字->reg,mem高字->dsLES reg,memmem低字->reg,mem高字->esLFS reg,memmem低字->reg,mem高字->fsLGS reg,memmem低字->reg,mem高字->gsLSS reg,memmem低字->reg转载 2012-12-11 13:23:16 · 3161 阅读 · 1 评论 -
repe cmpsb指令解析
repe是一个串操作前缀,它重复串操作指令,每重复一次ECX的值就减一 一直到CX为0或ZF为0时停止。 cmpsb是字符串比较指令,把ESI指向的数据与EDI指向的数一个一个的进行比较。 当repe cmpsb配合使用时就是字符串比较啦,当相同时继续比较,不同时不比较 mov edi,[ebp+08] 将你输入的密码的地址付给EDI mov esi,[ebp+转载 2012-12-10 13:10:06 · 32826 阅读 · 1 评论 -
DCD 伪指令解析
原文地址:关于汇编ARM指令DCD作者:晓喻数据定义( DataDefinition)伪指令数据定义伪指令一般用于为特定的数据分配存储单元,同时可完成已分配存储单元的初始化。— DCD ( DCDU)用于分配一片连续的字存储单元并用指定的数据初始化。3、 DCD(或DCDU)语法格式:标号 DCD (或 DCDU ) 表达式DCD (或 DCDU )转载 2012-12-08 20:12:57 · 13834 阅读 · 5 评论 -
bootsect.S
读写磁盘时是上下两个磁头是固定在一起的,为了速度是读写完一个磁道后在接着读里一个磁头对应的磁道。其中jae no_reg这条指令我没明白 还有就是bootsect.S为什么是大S呢.s 汇编语言源程序; 操作: 汇编.S 汇编语言源程序; 操作: 预处理 + 汇编--------------------------------------------------------原创 2012-12-07 14:45:06 · 1765 阅读 · 0 评论 -
2440init.s完全解析
;=========================================; NAME: 2440INIT.S; DESC: C start up codes; Configure memory, ISR ,stacks; Initialize C-variables;=========================================;汇编不能使用i转载 2012-12-07 20:11:00 · 3726 阅读 · 0 评论 -
bx lr
bx lr的作用等同于mov pc,lr即跳转到lr中存放的地址处。那么lr存放的是什么地址呢?lr就是连接寄存器(Link Register, LR),在ARM体系结构中LR的特殊用途有两种:一是用来保存子程序返回地址;二是当异常发生时,LR中保存的值等于异常发生时PC的值减4(或者减2),因此在各种异常模式下可以根据LR的值返回到异常发生前的相应位置继续执行。 当通转载 2012-12-07 20:57:58 · 2908 阅读 · 0 评论 -
bx lr 和 mov pc,lr
;bx lr 和 mov pc,lr 都是跳转到lr地址处,不同的是lr跳转到thumb模式,二另一个是ARM模式 是不是这样呢?原创 2012-12-07 21:06:42 · 3871 阅读 · 0 评论 -
寄存器详解
AX/EAX: 累加器,算术通用寄存器,与端口的通讯也用这个寄存器.BX/EBX: 基址寄存器.CX/ECX: 计数器,结合串处理指令使用.DX/EDX: 算术通用寄存器.和累加器结合表示双字长的数,其中累加器用于存低位数.[From]http://blog.youkuaiyun.com/huangwei1024/archive/2007/01/29/1496560.aspx2转载 2012-12-07 18:09:14 · 2306 阅读 · 0 评论 -
理解$HandlerLabel HANDLER $HandleLabel宏
接下来的代码如下(注黑色为源程序,蓝色为解说部分代码):MACRO $HandlerLabel HANDLER $HandleLabel $HandlerLabel sub sp,sp,#4 ;减少sp(用于存放转跳地址)实质上是在计算返回地址,用来存储PC地址 stmfd sp!,{r0} ;把将要使用的r0寄存器入栈转载 2012-12-07 22:29:22 · 1345 阅读 · 0 评论 -
stosb指令解析
stosb需要寄存器edi配合使用。每执行一次stosb,就将al中的内容复制到[edi]中。 即:stosb == al --> [edi]原创 2012-12-08 15:56:45 · 6414 阅读 · 0 评论 -
loadsb指令解析
loadsb:用于目的地址的内容读到源地址,即目标地址为:ES:DI,源地址为DS:SILODS LODSB LODSW LODSD 将字符串装入累加器(Load Accumulator from string) 将由DS:E(SI)寻址的一个内存字节或字装入累加器(AL, AX 或 EAX)中,如果使用LODS,必须 指定内存操作数.LODSB将一个字节装入A原创 2012-12-08 15:58:13 · 3816 阅读 · 0 评论 -
ASSERT :DEF:ENDIAN_CHANGE
; ASSERT---在汇编编译器对汇编程序的第二遍扫描中,如果ASSERT 条件不成立,ASSERT伪指令将报告该错误信息ASSERT :DEF:ENDIAN_CHANGE [ ENDIAN_CHANGE ASSERT :DEF:ENTRY_BUS_WIDTH [ ENTRY_BUS_WIDTH=32 b ChangeBigEndian ;DCD 0xea0000转载 2012-12-08 19:45:32 · 1562 阅读 · 0 评论 -
s3c2440启动文件详细分析
http://blog.youkuaiyun.com/zhaocj/article/details/5302370启动文件就是引导ARM启动,并进入我们熟悉的C语言程序。它主要完成了ARM最基本的硬件初始化工作。虽然启动文件的内容大同小异(就是设置系统时钟、内存、中断向量表、栈等内容),而且只要有一个现成的启动文件,即使不用详细了解该文件的内容,直接进入C语言编程工作也可以对ARM进行操作,但我认为熟悉启转载 2012-12-08 20:43:56 · 1267 阅读 · 0 评论 -
LOCKTIME寄存器
刚设置好PLL时,系统认为这时PLL还没稳定,所有这时不用PLL的时钟,而用外部晶振做时钟,将PLL锁住,过了LOCKTIME后认为PLL已经稳定了,才使用PLL给系统提供时钟。例如S3c2410手册上给出锁住时间必须大于150us,外部晶振为12M,那么(1/12M)*N>150us,其中N为U_LTIME或M_LTIME,N>1800,可以设置U_LTIME或和M_LTIME为0xff原创 2012-12-08 21:52:07 · 2364 阅读 · 0 评论 -
Image$$RO$$Limit
ARM IMPORT Image$$RO$$Limit 的含义IMPORT |Image$$RO$$Base| ; Base of ROM codeIMPORT |Image$$RO$$Limit| ; End of ROM code (=start of ROM data)IMPORT |Image$$RW$$Base| ; Base of RAM to initialise转载 2012-12-08 19:23:33 · 1374 阅读 · 0 评论 -
ARM汇编和C语言混合编程中数组的数组的操作
ARM汇编和C语言混合编程中数组的数组的操作此示例描述a数组中的元素累加的结果,c和b交换的实例: ·by fulinux(blog.youkuaiyun.com/fulinus)代码块例如:#include <stdio.h>int main (int argc, char **argv){ int a[4] = {1, 2, 3, 4}; int ...转载 2018-08-31 11:49:18 · 4154 阅读 · 0 评论