12 2023 档案
摘要:将ax寄存器中的有符号数扩展为dx:ax中的有符号数。如果ax是正数,则dx会被设置为00000000h;如果ax是负数,则dx会被设置为FFFFFFFFH .386 .model flat,stdcall option casemap:none .stack 4096 Include Irvine
阅读全文
摘要:将eax寄存器中的有符号数扩展为edx:eax中的有符号数。如果eax是正数,则edx会被设置为00000000h;如果eax是负数,则edx会被设置为FFFFFFFFH .386 .model flat,stdcall option casemap:none .stack 4096 Include
阅读全文
摘要:将AL寄存器中的有符号数扩展为AX中的有符号数。如果AL是正数,则AH会被设置为0;如果AL是负数,则AH会被设置为FFH .386 .model flat,stdcall option casemap:none .stack 4096 Include Irvine32.inc includelib
阅读全文
摘要:(这里讨论的指令仅适用于32位模式下的编程。)压缩二进制编码的十进制整数,或者称为压缩的BCD整数, 在每个字节中存放两个十进制数字。回忆一下在第1章中讲到的关于二进制编码的十进制整数的内容。为了简化代码编写, 我们只使用无符号BCD数。数值以小端序存放,最低十进制数字存放在最低地址,每个数字用4位
阅读全文
摘要:食物鉴别 梅干菜烧五花肉或排骨 香菇焖排骨 酱排骨 小炒牛肉 闷猪蹄 清蒸白灼鱼 清蒸鱼(孔雀开屏)-水煎蛋 水煎蛋:40°左右的温盐水(水量是鸡蛋的1.5倍),加入鸡蛋,搅拌均匀,倒入碗中(泡泡可以不倒入否则有蜂窝状),水开蒸7分钟左右 把有烧热,加入小葱,弄出葱香,倒入 加入适量白灼汁 胡椒猪肚
阅读全文
摘要:非压缩十进制整数的高4位总是为零, 而ASCII十进制数的高4位则等于0011b。在任何情况下,这两种类型的整数的每个数字都占用一个字节。下面的例子展示了3402在两种格式下是如何存放的: 尽管ASCII算术运算执行得比二进制算术运算要慢, 但是它有两个明显的优点: ●无须在执行算术运算之前对串格式
阅读全文
摘要:SBB(带借位减法) 指令从目的操作数中减去源操作数和进位标志的值。可使用的操作数与ADC指令相同。 下面的示例代码用32位操作数实现64位减法。设置EDX:EAX的值为0000000700000001h,并从该值中减去2。低32位先执行减法,并将进位标志置位,然后高32位再进行减法,包括减去进位标
阅读全文
摘要:ADC(带进位加法) 指令将源操作数和进位标志的值都加到目的操作数中。该指令的格式与ADD指令一样, 且操作数的大小必须相同: .386 .model flat,stdcall option casemap:none .stack 4096 Include Irvine32.inc includel
阅读全文
摘要:有符号除法就是将一个有符号数除以另一个有符号数 有符号整数除法与无符号除法几乎相同,只有一个重要的区别:在进行除法之前,必须将被除数进行符号扩展。为了说明为何有此必要, 我们先不这么做。下面的代码使用MOV将 -101赋值给A X, 即DX:AX的低半部分: .386 .model flat,std
阅读全文
摘要:在32位模式下, DIV(无符号整数除法) 指令执行8位、16位及32位的无符号整数除法。无符号除法(unsigned division) 定义为一个无符号数除以另一个无符号数。其中, 除数为单个寄存器或内存操作数。格式如下: 【a=c÷b,读作c除以b(或b除c)。其中,c叫做被除数,b叫做除数】
阅读全文
摘要:SHLD(双精度左移) 指令 将目的操作数向左移动指定的位数。移位形成的空位由源操作数的最高有效位填充。源操作数不受影响,但是符号标志、零标志、辅助进位标志、奇偶标志及进位标志会受影响: .386 .model flat,stdcall option casemap:none .stack 4096
阅读全文
摘要:LOOPNE(不等循环) 指令等价于LOOPNZ, 这两条指令执行如下任务: ECX =ECX -1 若ECX>0且ZF=0,则跳转到目的地址 实例: 扫描数组中的每一个数, 直到发现一个非负数为止 .386 .model flat,stdcall option casemap:none .stac
阅读全文
摘要:LOOPE(相等循环)指令等价于LOOPZ 这两条指令执行如下任务:ECX=ECX-1若ECX >0且ZF=1,则跳转到目的地址;否则结束循环 LOOPZ和LOOPE不影响任何状态标志 在32位模式下, ECX是循环计数器; 在64位模式下, RCX是循环计数器。
阅读全文
摘要:loop循环指令 LOOPZ和LOOPE指令 LOOPNZ和LOOPNE指令
阅读全文
摘要:.386 .model flat,stdcall option casemap:none .stack 4096 Include Irvine32.inc includelib Irvine32.lib ExitProcess PROTO,dwExitCode:DWORD .data .code m
阅读全文
摘要:.386 .model flat,stdcall option casemap:none .stack 4096 Include Irvine32.inc includelib Irvine32.lib ExitProcess PROTO,dwExitCode:DWORD .data .code m
阅读全文
摘要:.386 .model flat,stdcall option casemap:none .stack 4096 Include Irvine32.inc includelib Irvine32.lib ExitProcess PROTO,dwExitCode:DWORD .data .code m
阅读全文
摘要:.386 .model flat,stdcall option casemap:none .stack 4096 Include Irvine32.inc includelib Irvine32.lib ExitProcess PROTO,dwExitCode:DWORD .data .code m
阅读全文
摘要:.386 .model flat,stdcall option casemap:none .stack 4096 Include Irvine32.inc includelib Irvine32.lib ExitProcess PROTO,dwExitCode:DWORD .data .code m
阅读全文
摘要:.386 .model flat,stdcall option casemap:none .stack 4096 Include Irvine32.inc includelib Irvine32.lib ExitProcess PROTO,dwExitCode:DWORD .data .code m
阅读全文
摘要:.386 .model flat,stdcall option casemap:none .stack 4096 Include Irvine32.inc includelib Irvine32.lib ExitProcess PROTO,dwExitCode:DWORD .data .code m
阅读全文
摘要:.386 .model flat,stdcall option casemap:none .stack 4096 Include Irvine32.inc includelib Irvine32.lib ExitProcess PROTO,dwExitCode:DWORD .data .code m
阅读全文
摘要:.386 .model flat,stdcall option casemap:none .stack 4096 Include Irvine32.inc includelib Irvine32.lib ExitProcess PROTO,dwExitCode:DWORD .data .code m
阅读全文
摘要:实质:JE与JZ相同,JNE与JNZ相同,都是通过零标志位ZF跳转的 JE等于则跳转 je指令一般会与cmp指令搭配使用,因为cmp指令用于比较两个操作数的大小,je指令用于根据比较结果进行跳转 .386 .model flat,stdcall option casemap:none .stack
阅读全文
摘要:.386 .model flat,stdcall option casemap:none .stack 4096 Include Irvine32.inc includelib Irvine32.lib ExitProcess PROTO,dwExitCode:DWORD .data .code m
阅读全文
摘要:.386 .model flat,stdcall option casemap:none .stack 4096 Include Irvine32.inc includelib Irvine32.lib ExitProcess PROTO,dwExitCode:DWORD .data .code m
阅读全文
摘要:.386 .model flat,stdcall option casemap:none .stack 4096 Include Irvine32.inc includelib Irvine32.lib ExitProcess PROTO,dwExitCode:DWORD .data .code m
阅读全文
摘要:.386 .model flat,stdcall option casemap:none .stack 4096 Include Irvine32.inc includelib Irvine32.lib ExitProcess PROTO,dwExitCode:DWORD .data .code m
阅读全文
摘要:.386 .model flat,stdcall option casemap:none .stack 4096 Include Irvine32.inc includelib Irvine32.lib ExitProcess PROTO,dwExitCode:DWORD .data .code m
阅读全文
摘要:.386 .model flat,stdcall option casemap:none .stack 4096 Include Irvine32.inc includelib Irvine32.lib ExitProcess PROTO,dwExitCode:DWORD .data .code m
阅读全文
摘要:.386 .model flat,stdcall option casemap:none .stack 4096 Include Irvine32.inc includelib Irvine32.lib ExitProcess PROTO,dwExitCode:DWORD .data .code m
阅读全文
摘要:.386 .model flat,stdcall option casemap:none .stack 4096 Include Irvine32.inc includelib Irvine32.lib ExitProcess PROTO,dwExitCode:DWORD .data .code m
阅读全文
摘要:.386 .model flat,stdcall option casemap:none .stack 4096 Include Irvine32.inc includelib Irvine32.lib ExitProcess PROTO,dwExitCode:DWORD .data .code m
阅读全文
摘要:进位标志位CF=1就跳转 .386 .model flat,stdcall option casemap:none .stack 4096 Include Irvine32.inc includelib Irvine32.lib ExitProcess PROTO,dwExitCode:DWORD
阅读全文
摘要:执行条件结构需要两个步骤:第一步, 用如CMP、AND或SUB这样的指令来修改CPU的状态标志; 第二步, 用条件跳转指令来测试标志, 并使程序分支到一个新的地址。 根据进位标志位CF跳转 当状态标志条件为真时, 条件跳转指令就分支到目的标号;否则,当标志条件为假时,就执行紧跟在条件跳转后面的那条指
阅读全文
摘要:x86汇编语言用CMP指令比较整数。字符码也是整数, 因此可以用CMP指令 CMP(比较) 指令执行从目的操作数中减去源操作数的隐含减法运算, 并且不修改任何操作数: 标志CMP指令按照减法实际发生后目的操作数的值来修改溢出、符号、零、进位、辅助进位及奇偶等标志。 比较无符号操作数 当比较两个无符号
阅读全文
摘要:CF置0 .386 .model flat,stdcall option casemap:none .stack 4096 ExitProcess PROTO,dwExitCode:DWORD .data .code main PROC mov al,10000110b shl al,1 ;cf=1
阅读全文
摘要:布尔指令影响零标志、进位标志、符号标志、溢出标志及奇偶标志。下面简单回顾一下这些标志的含义: ●当运算结果等于0时,零标志置1。 ●当运算在目的操作数的最高位产生进位时,进位标志置1。 ●符号标志是目的操作数高位的副本,如果标志置1,表示是负数;标志清零,表示是正数(零假设为正)。 ●当指令产生的结
阅读全文
摘要:SHL左移 SAL算术左移 SHR右移 SAR算数右移 ROL循环左移 ROR循环右移 RCL带进位循环左移 RCR 带进位循环右移 SHLD/SHRD双精度左右移位指令 有符号数溢出
阅读全文
摘要:RCR(带进位循环右移)指令把每一位都向右移,进位标志位复制到 MSB,而 LSB 复制到进位标志位: 标志位 循环移位指令仅影响标志位CF和OF,对OF的影响是:ROR和RCR指令在执行一次右移后,如果操作数的最高位和原高位不等,表明移位后新的数据符号与原来的符号不同了,此时使OF = 1,产生溢
阅读全文
摘要:RCL(带进位循环左移)指令把每一位都向左移,进位标志位复制到 LSB,而 MSB 复制到进位标志位: 标志位 循环移位指令仅影响标志位CF和OF,对OF的影响是:ROL和RCL指令在执行一次左移后,如果操作数的最高位与CF(原先的符号位)不等,说明新的符号位与原来的符号位不同了,则使OF=1,表明
阅读全文
摘要:ROR(循环右移)指令把所有位都向右移,最低位复制到进位标志位和最高位 .386 .model flat,stdcall option casemap:none .stack 4096 ExitProcess PROTO,dwExitCode:DWORD .data .code main PROC
阅读全文
摘要:ROL(循环左移)指令把所有位都向左移。最高位复制到进位标志位和最低位 .386 .model flat,stdcall option casemap:none .stack 4096 ExitProcess PROTO,dwExitCode:DWORD .data .code main PROC
阅读全文
摘要:SAR(算术右移)指令将目的操作数进行算术右移: .386 .model flat,stdcall option casemap:none .stack 4096 ExitProcess PROTO,dwExitCode:DWORD .data .code main PROC mov al,0F0h
阅读全文
摘要:与SHL指令完全相同(这两个指令用那个也可以) 看:https://www.cnblogs.com/liming19680104/p/17878986.html
阅读全文
摘要:SHR(右移)指令使目的操作数逻辑右移一位,最高位用 0 填充。最低位复制到进位标志位,而进位标志位中原来的数值被丢弃: 格式: SHR destination,countR 第一个操作数是目的操作数,第二个操作数是移位次数 该指令可用的操作数类型如下所示:SHR reg, imm8SHR mem,
阅读全文
摘要:SAL(算术左移)指令的操作与SHL 指令一样 SHL(左移)指令使目的操作数逻辑左移一位,最低位用 0 填充。最高位移入进位标志位,而进位标志位中原来的数值被丢弃: 若将 1100 1111 左移 1 位,该数就变为 1001 1110: 格式: SHL destination,count 第一个
阅读全文
摘要:Test命令将两个操作数进行逻辑与运算(相当于AND运算),并根据运算结果设置符号标志、零标志和奇偶标志 。但是,Test命令的两个操作数不会被改变。运算结果在设置过相关标记位后会被丢弃 两操作数作与运算,仅修改标志位,不回送结果 TEST AX,BX 与 AND AX,BX 命令有相同效果,只是T
阅读全文
摘要:该指令允许的操作数类型如下所示:NOT regNOT mem .386 .model flat,stdcall option casemap:none .stack 4096 ExitProcess PROTO,dwExitCode:DWORD .data .code main PROC mov a
阅读全文
摘要:and的逻辑运算符 && AND 指令在两个操作数的对应位之间进行(按位)逻辑与(AND)操作,并将结果存放在目标操作数中: 下列是被允许的操作数组合,但是立即操作数不能超过 32 位: AND reg, regAND reg, memAND reg, immAND mem, regAND mem,
阅读全文
摘要:OR逻辑运算符 || OR 指令在两个操作数的对应位之间进行(按位)逻辑或(OR)操作,并将结果存放在目标操作数中: 格式: OR reg,regOR reg,memOR reg, immOR mem,regOR mem,imm 操作数可以是 8 位、16 位、32 位和 64 位,但是两个操作数必
阅读全文
摘要:XOR指令在两个操作数的对应位之间进行(按位)逻辑异或(XOR)操作,并将结果存在目标操作数中 两个操作数的每一对对应位都应用如下操作原则:如果两个位值相同(同为0或同为1),则结果位等于0;否则结果位等于1。下标描述的是布尔运算x⊕y: 与0异或值不变,与1异或则被触发(求补)。对相同操作数进行两
阅读全文
摘要:在分支和循环的伪指令反汇编后可以发现, 在使用>、>=、<和<=比较符时, MASM的伪指令总是将比较以后的跳转指令使用为jb和jnb等无符号数比较跳转的指令, 这就意味着, MASM的条件测试总是把操作数当做无符号数看待, 这样, 假设eax等于1, 那么表达式(eax>-1) 的值是“假”, 因
阅读全文
摘要:.repeat/.UNTIL 语法结构 .repeat/.until循环首先执行一遍循环体内的指令, 然后再判断条件测试表达式, 如果结果为“真”的话, 就退出循环, 如果为“假”, 则返回.repeat处继续循环, 可以看出, .repeat/.until 不管表达式的值如何,至少会执行一遍循环体
阅读全文
摘要:语句结构: .while/.endw循环首先判断条件测试表达式, 如果结果是“真”, 则执行循环体内的指令,结束后再回到.while处判断表达式, 如此往复, 一直到表达式结果为“假”为止。 .while/.endw 指令有可能一遍也不会执行到循环体内的指令,因为如果第一次判断表达式时就遇到结果为“
阅读全文
摘要:.if语句语法 注意:关键字if/elseif/else/endif的前面有个小数点, 如果不加小数点, 就变成宏汇编中的条件汇编伪操作了,结果可是天差地别。 .386 .model flat,stdcall option casemap:none .stack 4096 ExitProcess P
阅读全文
摘要:MASM的条件测试语句有几个限制, 首先是表达式的左边只能是变量或寄存器, 不能为常数;其次表达式的两边不能同时为变量,但可以同时是寄存器。 标志位的状态指示,它们本身相当于一个表达式: CARRY? 表示进位标志位是否置位 OVERFLOW? 表示溢出标志位是否置位 PARITY? 表示奇偶标志位
阅读全文
摘要:对于全局变量 它的地址在编译的时候已经由编译器确定了,它的用法大家都不陌生: mov 寄存器, offset 全局变量名 addr获取局部变量 对于局部变量,它是用ebp来做指针操作的 局部变量1的地址是ebp-4,局部变量2的地址是ebp-8...... 由于ebp的值随着程序的执行环境不同可能是
阅读全文