首页 > 编程知识 正文

x86汇编指令机器码,汇编环境

时间:2023-05-04 09:20:20 阅读:130615 作者:3296

控制命令控制指令组件的控制命令主要包括标签,有无条件跳转和有条件跳转几个

标签标签用于标签跳转,必须以字母开头,后跟字母、数字和下划线,以冒号:结尾

yasm的标签区分大小写

无条件地跳转到非协调控制语句格式

jmplabeljmpstartloopjmpifdonejmplast条件跳转Conditional Control Instructions条件跳转通常发生在一个比较指令之后,比较的结果决定是否执行跳转。 比较指令的结果被存储在rFlag寄存器中。 条件跳转随后进行比较指令,以防止其他指令修改结果。

比较命令的格式

cmp op1、op2 op1和op2必须大小相同且不能修改。 同时不能是内存。 op1不能是即时数。 跳转命令je和jne对于无符号数和有符号数也同样适用。 但是,其他的跳转命令有区别,有符号数适用于jl、jle、jg、jge; jb、jbe、ja、jae .列表适用于无符号数

JE标签; if op1==op2jne label; if op1!=OP2JL标签; signed,if op1 op2jle label; signed,ifOP1=OP2JG电平; signed,if op1 op2jge label; 签名; IFOP1=OP2JB电平; 未指定,if op1 op2jbe label; 未指定,if op1=op2ja label; 未指定,if op1 op2jae label; unsigned,if op1=op2例关于以下判断语句

if(currnummymax ) )。

myMax=currNum;

; 首先定义变量currNum dq 0myMax dq 0; 代码为mov rax、qword [currNum] cmp rax、qword [myMax]; if currNum=myMax jle notNewMax; skip set new max mov qword [myMax],raxnotNewMax:的另一个示例

if(x!=0}{

ans=x/y;

errFlg=FALSE;

} else {

ans=0;

errFlg=TRUE;

}

代码

true equ1false equ0x dd0 y dd0 ans dd0 errflgdbfalse; cmp dword [x],0; if语句je do else mov eax,dword [ x ] cdqidivdword [ y ] mov dword [ ans ],eax mov byte [errFlg],falsejmpskpelsedoelse 3333

超出跳转范围的范围范围一般情况下,条件跳转的目标标签在128字节以内,超出范围时会发生范围超出的错误。 但是,无条件跳跃没有这个限制。 可以通过以下方法解决这个问题

cmp rcx,0 jeendofloopjmpstartofloopendofloop :通过使用je jmp而不是jne来避免条件跳转限制

名为枚举Iteration的控制指令用于枚举或循环。 基本循环由计数器、上下判断和跳转组成。 例如

maxN dq 30sum dq 0; 下面的代码是从1到maxN的奇数之和. mov rcx,qword [maxN]; loop countermov rax,1; oddintegercountersumloop 3360 add qword [ sum ],rax; sum current odd integer add rax,2; 设置下一个奇数集成器dec rcx; decrement loop counter cmp rcx,0 jne sumLoop在本示例中,rcx用于计数循环,rax用于存储当前循环的奇数,用1初始化,每次加2。

也可以在运行时减少rcx寄存器的值,与0相比,以不等于0时跳转的形式,通过loop指令实现(例如

loop label

以前的代码可以用loop改写为:

mov rcx,qword [maxN]; loop countermov rax,1; oddintegercountersumloop 3360 add qword [ sum ],rax; sum current odd integeradd rax,2; set next odd integerloop sumLoop在循环中改写并检查rcx寄存器,因此如果未初始化rcx寄存器,将出现未知的循环次数。 loop指令有助于编程,但仅限于rcx寄存器。 如果需要多层loop,则必须在循环内外保存和恢复rcx当前值。

代码示例平方数总和Sum of Squares; simpleexampleprogramtocomputethe; sum of squares from 1 to N . * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * data declarations section.data; ----; 定义一致性成功equ 0; successfuloperationsys _ exit equ 60; 呼叫代码for termin ate; definedata.nd D10 sumofsquaresdq 0; * * * * * * * * * * * * * * * * * * * * * * * * section.textgllon-- -; 计算sum of squares from1to n . Approach: for(I=1; iN; I; sumOfSqaures =i^2; mov rbx,1; imov ecx,dword [n]sumLoop:mov rax,rbx; 获取imul rax; I ^ 2添加qword [ sumofsquares ],raxinc rbxloop sumLoop; ----; Done,termin ate program.last : mov rax,SYS_exit; 呼叫代码for exitmov rdi,SUCCESS; 退出使用success syscall。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。