




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第六章 算术运算类指令 IA32处理器的基本指令系统 加 法 指 令6.1十 进 制 调 整 指 令6.5减 法 指 令6.2除法 指 令6.4乘 法 指 令6.3算术运算类指令概论 汇编语言程序中执行数学操作的基本过程是整数运算。在本章讨论的运算都是基于整数操作。算术运算是对数据进行加减乘除,它是基本的数据处理方法。加减运算有“和”或“差”的结果外,还有进借位、溢出等状态标志,所以状态标志也是结果的一部分。6.1 加法指令 加法运算包含add、adc和inc三条指令,除inc不影响进位标志CF外,其他指令按定义影响全部状态标志位、即按照运算结果相应设置各个状态标志为0或为1,它们都和二进制数
2、值如何相加有关。1、加法指令ADD2、检测进位或溢出的情况 3、带进位的加法指令ADC 4、增量指令INC ADD指令可以将8位、16位或32位值相加。和其他GNU汇编指令一样,必须通过在ADD助记符的后面添加b(用于字节)、w(用于字)或者l(用于双字)来指定操作数的长度。 6.1.1 加法指令ADD ADD指令用于把目的操作数加上源操作数,结果送到目的操作数。 ADD指令格式如下:addx src, dest # 加法:dest=dest+src续上页下面是使用add指令的例子: addb $100,%al #立即数100和8位的寄存器al相加,结果赋给al addw %ax,%bx #1
3、6位的寄存器ax和bx相加,结果赋给bx addl dvar,%eax #32位变量dvar的值和32位寄存器eax相加,结果赋给eax addl %eax,%eax #32位寄存器eax和自己相加,结果还赋给本身例题6.1使用add指令进行操作1(addtest1.s).section .datadvar: .int 70.section .text.globl _start_start: nop movl $0, %eax 例题6.1续1movl $0, %ebx movl $0, %ecx movb $50, %aladdb $30, %al movsx %al, %eax movw $
4、300, %cx addw %cx, %bx例题6.1续2 movsx %bx, %ebx movl $500, %edx addl %edx, %edx addl dvar, %eax addl %eax, dvar movl $1, %eax movl $0, %ebx int $0 x80 例题6.2使用add指令进行操作2(addtest2.s).section .datadvar: .int -40.section .text.globl _start_start: nop movl $-10, %eax例题6.2续1 movl $-200, %ebx movl $80, %ecx
5、addl dvar, %eax addl %ecx, %eax addl %ebx, %eax addl %eax, dvar addl $210, dvar例题6.2续2 movl $1, %eax movl $0, %ebx int $0 x80经过汇编连接后,对程序进行调试,我们可以查看到运行完加法指令后的结果。(gdb) p $eax$1=-170 开始都是默认以十进制显示数值例题6.2续3(gdb) p $ebx$2=-200(gdb) p $ecx$3=80(gdb) x/d &dvar0 x80490ac : 0得出结果:ADD指令对程序里的所有带符号整数都进行了正确的运算。6.
6、1.2 检测进位或溢出的情况 当整数相加时,我们应该也必须关注EFLAG寄存器值的变化,以便确保操作过程中不会发生奇怪的事情。当对无符号数进行相加造成进位时(即结果值大于允许的最大值),进位标志位CF=1;当对有符号数进行相加造成溢出时(即结果值小于允许的最小负值,或大于允许的最大正值),溢出标志位OF=1。 OF、CF被设置为1时,说明目的操作数的长度太小,不能保存加法的结果值。续上页进位和溢出标志的设置与加法中使用的数据长度相关联。例如,在addb指令中,如果结果超过255,就会把进位标志位CF设置为1,但在addw指令中,结果超过65535,进位标志位CF才会被设置为1。例题6.3 检测
7、进位标志位CF的操作(addtest3.s) .section .text.globl _start_start: nop movl $0, %ebx movb $190, %bl movb $100, %al addb %al, %bl jc next例题6.3续1 movl $1, %eax int $0 x80next: movl $1, %eax movl $0, %ebx int $0 x80例题6.3 续3下面我们检查这个程序运行的结果: $ . /addtest3 $ echo ? 0 $其中echo $ ?命令是返回bl的值,以十进制显示。例题6.3 续4运行的结果为0,说明该
8、程序加法运算产生了进位CF=1,发生了跳转。现在,我们改动一下寄存器的值,使加法不发生进位: movb $190, %bl movb $10, %al运行结果应该是:$ . /addtest3 $ echo $ ? 200 $这个结果表明加法结果没有产生进位,也就没发生跳转。例题6.3 续5对于无符号数进行加法时了解结果是否超出数值表达的范围,则一定要检查进位标志位是否为1。对于带符号数的加法运算则必须关注溢出标志位OF,此时CF就没有什么用处了。当结果溢出正值或负值界限范围时,OF标志都会被设置为1。例题6.4 检测溢出标志位OF的操作(addtest4.s) .section .datas
9、tring: .asciz The sum is %dn.section .text.globl _start_start: movl $-1590876934, %ebx movl $-1259230143, %eax 例题6.4 续1 addl %eax, %ebx jo next pushl %ebx pushl $string call printf add $8, %esp pushl $0 call exit例题6.4 续2 next:pushl $0pushl $stringcall printfadd $8, %esppushl $0call exit例题6.4 续3 该程序试
10、图把两个大的负数相加,则造成了溢出情况。jo指令用于检查溢出标志位并且如果OF=1则把控制传递到标号next处。因为这个程序使用了C函数printf,所以要记住把它和系统的动态连接器以及C库连接在一起。如果运行这个程序,则它的结果应该是下面的输出:$ . /addtest4 The sum is 0$例题6.4续4 这个结果表明产生了溢出。如果修改movl 两个指令,使其相加不产生溢出,就会看到相加的结果。例如: movl $-190876934, %ebx movl $-159230143, %eax则会生成如下结果: $ . /addtest4 The sum is -350107077
11、$当然在做加法运算时,除了影响进位标志和溢出标志外,也影响SF、ZF、PF、AF等标志位。 例题6.4续5 对于8位运算指令,状态标志位反映8位运算结果的状态;同样,进行16位或32位运算,状态标志(除PF)也是反映16位或32位运算结果的状态。上章介绍的数据传送类指令中,除了标志位是目的操作数的传送指令外,其他传送指令并不影响标志;也就是说,标志并不因为传送指令的执行而改变。6.1.3 带进位的加法指令ADC 带进位加法指令ADC(Add with Carry)除完成ADD加法运算外,还要加上进位CF,结果送到目的操作数,按照定义影响6个状态标志位,格式如下:adcx src,dest# 带
12、进位加法:destdestsrcCF续上页 其中src可以是立即数或8位、16位或32位寄存器或内存单元,dest可以是8位、16位或32位寄存器或内存单元。注意src和dest不能同时为内存单元。还有,和add指令一样,GNU汇编器要求助记符中用附加的字符来表明操作数的长度(b、w或l)。续上页 adc指令的设计目的是用于与add指令相结合实现多精度数的加法。IA-32处理器可以实现32位加法。但是,多于32位的数据相加就需要先将两个操作数的低32位相加(用add指令),然后再加高位部分、并将进位加到高位(需要用adc指令)。例题6.5 使用ADC指令的操作(adctest.s).secti
13、on .dataqvar1: .quad 7252051615qvar2: .quad 5732348928string: .asciz The sum is %qdn.section .text例题6.5续1.globl _start_start: nop movl qvar1, %ebx movl qvar1+4, %eax movl qvar2, %edx movl qvar2+4, %ecx例题6.5续2 addl %ebx, %edx adcl %eax, %ecx pushl %ecx pushl %edx push $string call printf addl $12, %e
14、sp pushl $0 call exit例题6.5续3 汇编和连接后,可以直接显示其输出值,也可运行调试器GDB来监视处理过程中的各个步骤中的值。$ as gstabs o adctest.o adctest.s$ ld dynamic-link /lib/ld-linux.so.2 lc o adctest adctest.o$ gdb q adctest(gdb) b *_start+1显示设置断点的位置例题6.5续4(gdb) run 到断点处停下(gdb) s .单步执行然后可查看寄存器的值(gdb)i r 显示寄存器的值 eax 0 x1 1 ecx 0 x1 1 edx 0 x5
15、5acb400 1437381632 ebx 0 xb041869f -1337882977例题6.5续5 程序中把64位整数赋值给了4个寄存器,GDB假设寄存器的值是带符号整数,所以第三列的值是没有意义的。执行完加法指令后,再查看寄存器的值:(gdb)i r 显示寄存器的值 eax 0 x1 1 ecx 0 x3 3 edx 0 x5ee3a9f 99498655 ebx 0 xb041869f -1337882977例题6.5续6 最后ecx:edx寄存器对包含了最后的结果,执行程序可以显示结果: $ ./adctest The sum is 12984400543 $6.1.4 增量指令
16、INC 增量指令INC(Increment)只有一个操作数,对操作数加1(增量)再将结果返回原处。 操作数是寄存器或存储单元,格式如下:incx reg/mem# 加1:reg/memreg/mem1x可以是b、w或l。设计增量指令的目的,主要用于对计数器和地址指针的调整,所以它不影响进位CF标志,但影响其他状态标志位。6.2 减法指令 减法指令SUB 减法操作中的借位和溢出 带借位的减法指令SBB减量指令DEC 求补指令NEG 比较指令CMP 6.2.1 减法指令SUB 减法指令SUB(Subtract)使目的操作数减去源操作数,差的结果送到目的操作数,格式如下:subx src,dest#
17、 减法:destdestsrc像add指令一样,sub指令支持寄存器与立即数、寄存器、存储单元,以及存储单元与立即数、寄存器间的减法运算,按照定义影响6个状态标志位。和add指令一样,GNU汇编器需要在助记符后面加上长度符号。长度符号x仍然是通常使用的b、w或l。例题6.6使用sub指令进行操作(subtest1.s) .section .datadvar: .int 20.section .text.globl _start_start: nop movl $0, %eax 例题6.6续1 movl %eax, %ebx movl %eax, %ecx movb $20, %al subb
18、$10, %al movsx %al, %eax movw $100, %cx subw %cx, %bx movsx %bx, %ebx 例题6.6续2 movl $100, %edx subl %eax, %edx subl dvar, %eax subl %eax, dvar movl $1, %eax movl $0, %ebx int $0 x80例题6.6续3 $ as gstabs o subtest1.o subtest1.s $ ld o subtest1 subtest1.o$ gdb q subtest1 (gdb) b *_start+1 显示设置断点的位置(gdb)
19、run (gdb) s例题6.6续4直到最后倒数第二条SUB指令执行完毕,查看:(gdb) p $eax $1=-10(gdb) x/d &dvar 0 x80490ac : 20(gdb) s 例题6.6续 5(gdb) x/d &dvar 0 x80490ac : 30(gdb) 20减去-10,得到结果的确是30,正确。GNU汇编器的SUB指令中的操作数的顺序,和Intel语法是相反的,这点非常重要。6.2.2 减法操作中的借位和溢出 和ADD指令类似,执行减法操作之后,SUB指令会改变EFLAG标志位。如果最高位发生了借位,则进位/借位标志位CF=1;如果加法操作使得结果超过了正数最大
20、值或负数最大值,则溢出标志位OF=1。 当然对OF是否设置为1的判断取决于加法的判断原则:正正得负,负负得正,则OF=1;否则其他情况都不溢出。另外减法操作也对其他标志位影响:ZF、PF、SP和AF。例题6.7 检测进位标志位CF的操作(subtest2.s) .section .text.globl _start_start: nop movl $34, %eax movl $23, %ebx subl %eax, %ebx 例题6.7续1 jc next movl $1, %eax int $0 x80next: movl $1, %eax movl $0, %ebx int $0 x80
21、例题6.7续2对该程序进行汇编之后运行它: $ . /subtest2 $ echo $ ? 0 $ 说明发生了跳转,即CF=1,产生了借位,和我们分析的一致。 试考虑如果将该程序中的jc改为jo会是什么样子呢?请大家修改执行。例题6.8检测溢出标志位OF的操作(subtest3.s) .section .datastring: .asciz The sum is %dn.section .text.globl _start_start: movl $-1590876934, %ebx movl $1234567890, %eax例题6.8续1 subl %eax, %ebx jo next
22、pushl %ebx pushl $string call printf add $8, %esp pushl $0 call exit例题6.8续2 next: pushl $0 pushl $string call printf add $8, %esp pushl $0 call exit例题6.8续3 汇编连接后执行结果如下: $ . /subtest3The sum is 0$ 说明该程序的执行发生了跳转,产生了溢出,即OF=1。现在将其中第2条指令修改如下: movl $-1259230143, %eax 例题6.8续4再次运行程序: $ . /subtest3 The sum i
23、s -33164791 $ 说明该程序在修改之后没有发生跳转,没有产生溢出,即OF=0。因为负数减去了一个负数,相当于加上一个正数,负数加上一个正数,怎么都不会产生溢出。6.2.3 带借位的减法指令SBB 带借位减法指令SBB(Subtract with Borrow)除完成SUB减法运算外,还要减去借位CF,结果送到目的操作数,按照定义影响6个状态标志位,格式如下:sbbx src,dest # 带借位减法: destdestsrcCF续上页 其中src可以是立即数或8位、16位或32位寄存器或内存单元,dest可以是8位、16位或32位寄存器或内存单元。注意src和dest不能同时为内存单
24、元。还有,和add指令一样,GNU汇编器要求助记符中用附加的字符来表明操作数的长度(b、w或l)。 续上页 sbb指令主要用于与sub指令相结合实现多精度数的减法。多于32位数据的减法需要先将两个操作数的低32位相减(用sub指令),然后再减高位部分、并从高位减去借位(需要用sbb指令)。例题6.9 使用SBB指令的操作(sbbtest.s).section .dataqvar1: .quad 7252051615qvar2: .quad 5732348928string: .asciz The result is %qdn.section .text 例题6.9续1.globl _start
25、_start: nop movl qvar1, %ebx movl qvar1+4, %eax movl qvar2, %edx movl qvar2+4, %ecx subl %ebx, %edx例题6.9续2 sbbl %eax, %ecx pushl %ecx pushl %edx push $string call printf add $12, %esp pushl $0 call exit例题6.9续3 对程序进行汇编连接之后执行,结果如下: $ . /sbbtest The result is -1519702687 $6.2.4 减量指令DEC 减量指令DEC(Decremen
26、t)对操作数减1(减量)再将结果返回原处,格式如下: decx reg/mem # 减1:reg/memreg/mem1 x可以是b、w或l。 DEC指令对应INC指令, 也主要用于对计数器和地址指针的调整, 不影响进位CF标志,但影响其他状态标志位。例题6.10大小写字母转换程序(invert.s).section .datamsg:.asciz “welcomen” len =.-msg .section .text.globl _start_start: nop movl $len,%ecx # ecx等于字符串长度例题6.10续1 movl $0,%ebx # ebx0指向头一个字母a
27、gain:subb $0 x20,msg(%ebx)# 小写字母减0 x20转换为大写 incl %ebx # 指向下一个字母 loop again # 循环 pushl $msgcall printf #显示转换过的字符串 addl $4,%esp pushl $0 call exit6.2.5 求补指令NEG 求补指令NEG(Negative)也是一个单操作数指令,它对操作数执行求补运算,即用零减去操作数,然后结果返回操作数。negx reg/mem# 用0作减法:reg/mem0reg/mem neg指令对标志的影响与用零作减法的sub指令一样,可用于求补码或由补码求其绝对值。续上页mo
28、vw $0 xff64,%axnegb %al # ax=0 xff9c, OF=0,SF=1,ZF=0, PF=1,CF=1subb $0 x9d,%al # ax=0 xffff, OF=0,SF=1, ZF=0,PF=1,CF=1negw %ax # ax=0 x0001,OF=0,SF=0,ZF=0, PF=0,CF=1decb %al # ax=0 x0000,OF=0,SF=0,ZF=1, PF=1,CF=1negw %ax # ax=0 x0000,OF=0,SF=0,ZF=1, PF=1,CF=06.2.6 比较指令CMP 比较指令CMP(Compare)将目的操作数减去源操作
29、数,差值不回送目的操作数,即不会修改这两个操作数,但按照减法结果影响状态标志,格式如下:cmpx src,dest# 减法运算:destsrccmp指令通过减法运算影响状态标志,根据标志状态可以获知两个操作数的大小关系。它主要给条件转移等指令使用其形成的状态标志。例题6.11使用CMP指令操作(cmptest.s) .section .text.globl _start_start: nop movl $55, %eax movl $30, %ebx cmp %eax, %ebx jae next movl $1, %eax 例题6.11续1int $0 x80next: movl $20,
30、%ebx movl $1, %eax int $0 x80 该例题使用cmp和jae条件跳转指令来判断程序的走向。55赋值给eax,30赋值给ebx,比较ebx是否比eax大或等于,如果成立则跳转,否则不进行分支操作。例题6.11续2汇编连接执行:$ ./cmptest$ echo $?30$ 显然结果表明:没有发生跳转,符合我们预期的设想。例题6.11续3下面是cmp指令其他的一些例子:cmp $200,%ebx #寄存器和立即数的比较cmp dvar,%ebx #寄存器和变量的比较cmp (%esi),%ebx #寄存器和esi指向的内存里的数据比较6.3 乘法指令 无符号数整数乘法MUL
31、 带符号整数乘法IMUL检查溢出情况乘法总结 在整数运算中比较复杂的功能之一是乘法。与加减法不同,对于无符号数和有符号数的乘法操作需要不同的指令 6.3.1 无符号数整数乘法MUL 基本的乘法指令指出源操作数src(寄存器或存储单元),隐含目的操作数dest(al/ax/eax)。 MUL指令格式如下: mulx src # ax=alr8/m8 # dx:ax=axr16/m16 # edx:eax=eaxr32/m32例题6.12使用MUL指令操作(multest.s) .section .datadvar1: .int 315814dvar2: .int 165432value: .qu
32、ad 0output:.asciz The value is %qdn 例题6.12续1.section .text.globl _start_start: nop movl dvar1, %eax mull dvar2 movl %eax, value例题6.12续2 movl %edx, value+4 pushl %edx pushl %eax pushl $output call printf add $12, %esp pushl $0 call exit例题6.12续3$ as gstabs o multest.o multest.s$ ld dynamic-link /lib/l
33、d-linux.so.2 lc o multest multest.o例题6.12续4$ gdb q multest(gdb) b *_start+1 显示设置断点的位置(gdb) run (gdb) s直到mul指令执行完毕,查看:(gdb) p/x $eax例题6.12续5$1=0 x2a16c050(gdb) p/x $edx$2=0 xc(gdb) s(gdb) s(gdb) x/gd &value 以十进制显示value变量指示内存的八个存储单元的内容例题6.12续60 x80491c4 : 52245741648(gdb) x/8b &value 以十六进制显示value变量指示内
34、存的八个存储单元的内容0 x80491c4 : 0 x50 0 xc0 0 x16 0 x2a 0 x0c 0 x00 0 x00 0 x00(gdb)$ ./ multestThe value is 52245741648$显然显示结果和调试器里观察到的结果是一致的。6.3.2 带符号整数乘法IMUL 和无符号整数乘法类似,基本的带符号乘法指令指出源操作数src(寄存器或存储单元),隐含目的操作数dest(al/ax/eax)。 IMUL指令格式如下: imulx src # ax=alr8/m8 # dx:ax=axr16/m16 #edx:eax=eaxr32/m32续上页 需要特别说明
35、的 IMUL指令可以用于无符号数和有符号数的乘法,但必须小心结果不使用目标的最高有效位(因最高做符号位使用)。对于较大的值,IMUL指令只对带符号数是合法的。为了应付比较复杂的情况,IMUL指令有3种不同的格式。 续上页 除了上面基本格式外,imul的第二种格式允许指定eax寄存器之外的目标操作数: imulx src, dest # dest=destsrc 其中src可以是立即数、r16、r32、m16或m32,dest必须是r16或r32。这种格式允许指定把乘法的结果存放在哪个位置(而不是一定存放在ax和dx寄存器中)。 续上页 这种格式的缺陷在于乘法操作的结果被限制为单一的目标寄存器的
36、长度(不能是64位)。使用这种格式必须非常小心,不要溢出目标寄存器。imul的第三种格式允许指定3个操作数: imulx imm, src, dest # dest=srcimm续上页 imm立即数,可以是i8、i16或i32;src可以是16位或32位的寄存器或内存值,dest必须是16位或32位的通用寄存器。这种格式允许把一个值(src)和一个带符号数(imm)的快速乘法操作,并把结果存储到通用寄存器(dest)中。使用GNU汇编器时,必须在助记符后面加上x,x取b、w或l。 例题6.13使用IMUL指令操作(imultest1.s) .section .datadvar1: .int 1
37、0dvar2: .int -35dvar3: .int 400例题6.13续1.section .text.globl _start_start: nop movl dvar1, %ebx movl dvar2, %ecx imull %ebx, %ecx 例题6.13续2movl dvar3, %edx imull $2, %edx, %eaxmovl $1, %eax movl $0, %ebx int $0 x80 例题6.13续3 汇编和连接之后,使用调试器监视程序执行过程中的寄存器的值,单步执行IMUL指令之后,寄存器里的值应该如下:(gdb) i r eax 0 x320 800
38、ecx 0 xfffffea2 -350 edx 0 x190 400 ebx 0 xa 10读者分析结果是否和自己预期的一致。6.3.3 检查溢出情况 当使用带符号数进行IMUL指令运算时,特别要注意运算结果是否溢出,这个工作是使用jo来完成的。 例题6.14使用IMUL指令检查是否溢出的操作(imultest2.s).section .text.globl _start_start: nop movw $900, %ax movw $120, %cx imulw %cx 例题6.14续1jo nextmovl $1, %eax movl $0, %ebx int $0 x80next: m
39、ovl $1, %eax movl $1, %ebx int $0 x80例题6.14续2 经过汇编连接后,直接执行程序,通过观察返回bl的值来判定是否溢出,即是否跳转到标号next处。然后再修改ax的输入值,使得运行结果和上面不同,分析原因。6.3.4 乘法总结 乘法指令分成无符号数乘法指令MUL和有符号数乘法指令IMUL。因为同一个二进制编码表示无符号数和有符号数时,真值可能不同。例如:计算二进制数乘法:0 xa50 x64。如果把它们当作无符号数,用mul指令结果为0 x4074(16500)0 xa5(165)0 x64(100)。如果采用imul指令,则结果为0 xdc74(9100
40、)0 xa5(91)0 x64(100)。注意:加减指令只进行无符号数运算,程序员利用 CF和OF区别结果。续上页基本的乘法指令按如下规则影响标志OF和CF。若乘积的高一半是低一半的符号位扩展,说明高一半不含有效数值,则OFCF0;乘积高一半有效,则用OFCF1表示。但是,乘法指令对其他状态标志没有定义,也就是成为任意,不可预测。注意,这一点是与数据传送类指令对标志没有影响是不同的,没有影响是指不改变原来的状态。关于乘法指令的使用情况总结在表6-1中。表6-1 乘法指令 指令类型指令操作数组合及功能举例无符数乘法mulx srcaxalr8/m8dx:axaxr16/m16edx:eaxeax
41、r32/m32mulb %bl mulw %bxmull %ebximull dvar有符数乘法imulx src双操数乘法imulx src,destr16r16i8/i16/r16/m16r32r32i8/i16/i32/r32/m32imulw $10,%cximull %ebx,%ecx三操数乘法imulx imm,src.destr16r16/m16i8/i16r32r32/m32i8/i16/i32imulw $2,%ax,%bx,imul $5,%esi,%eax6.4 除法指令概论 和乘法类似,根据使用的是无符号数还是有符号数,除法操作分别需要特定指令。整数除法的难点是答案不总
42、是精确的整数,比如9除以2,就会生成两部分答案:商和余数。这样对这两部分答案就需要两个地方来存放。6.4 除法指令无符号数除法 div有符号数的除法 idiv检查除法错误 除法总结 6.4.1 无符号数除法 DIV指令用于无符号数除法操作。 其格式如下: divx divisor 除法操作的结果是两个单独的值:商和余数。这两个值都被存放在与被除数使用的相同寄存器中。具体情况见表6-2。 在执行DIV指令之前,被除数(隐含)必须已经被存储到了AX寄存器(对于8位除数)、dx:ax寄存器对中(对于16位除数)或edx:eax寄存器对中(对于32位除数)。例题6.15使用DIV指令的操作(divte
43、st.s).section .datadividend: .quad 123456789divisor: .int 123quotient: .int 0remainder: .int 0例题6.15续1msg: .asciz “The quotient is %d, and the remainder is %dn”.section .text.globl _start_start: nop movl dividend, %eax movl dividend+4, %edx divl divisor 例题6.15续2 movl %eax, quotient movl %edx, remainder pushl remainder pushl quotient pushl $msg call printf add $12, %esp pu
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年医务人员流感培训手册
- 暗挖隧道培训课件
- 院前急救一般护理常规
- 现场急救培训讲座
- 店铺人员培训课件
- 课题研究报告的内容
- 云南大学本科论文系统
- 酒店设计培训
- 指挥部流程建设标准化实施路径
- 幼儿园教师讲故事培训
- 2009-2022历年河北省公安厅高速交警总队招聘考试真题含答案2022-2023上岸必备带详解版4
- 六年级信息技术下册《走进人工智能》优质课获奖课件
- 工程开工报告表
- 劳动法课件(完整版)
- 营运车辆智能视频监控系统管理制度范本及动态监控管理制度
- 完整版:美制螺纹尺寸对照表(牙数、牙高、螺距、小径、中径外径、钻孔)
- 偏头痛PPT课件(PPT 43页)
- (完整版)入河排污口设置论证基本要求
- 10kV架空线路施工方案
- 2022年人教版小学数学一年级下册期中测试卷二(含答案)
- 关于恒温恒湿项目装修方案及装修细部做法
评论
0/150
提交评论