admin管理员组文章数量:1032603
常用汇编指令
mov ah,2 int 21h 输出单个字符 mov ah,9 int 21h 输出字符串与DX联用!
mov ah,4ch int 21h 这是返回DOS
计算机汇编语言的一个突出优点就是利用符号(Symbol)来代替目标码,也即大量的二进制代码用符号来表示,使汇编语言源程序容易理解,便于记忆. 在宏汇编语言中所有变量名、标号名、记录名、指令助记符和寄存器名等统称符号.这些符号可通过汇编控制语句的伪操作命令重新命名,也可以通过指令给它定义其它名字及新的类型属性,因而给程序设计带来很大的灵活性.符号是程序员在程序中用来代表某个存储单元、数据、表达式和名字等所定义的标识符,可分为寄存器、标号、变量、数字、名字五类. 汇编语句形式: START: ADD AX,BUFFER DATA SEGMENT BUFFER DB 01H, 02H DATA ENDS JMP START其中START,BUFFER,DATA均为符号,它们分别表示标号,变量名,段名,它们具有完全不同的特定含意.
标号 标号(LABEL)是为一组机器指令所起的名字.标号可有可无,只有当需要用符号地址来访问该语句时,才给此语句赋予标号.标号是程序的目标标志,总是和某地址相联系,供转移或循环指令控制转移使用. 2 1 标号的属性 因标号表示的是指令地址,所以它有三个属性,即段属性、偏移属性和类型属性.段属性即段地址,标号的段必须在CS中.偏移属性是表示该标号到段首地址的距离,单位是字节,是16位无符号整数.类型属性是距离属性,指标号和转移指令的距离,该标号在本段内引用,距离在-128~+127之间时称短标号,距离属性为SHORT,当标号在本段,距离在-32768~+32767之间时称近标号,距离属性为NEAT,当引用标号的指令和标号不在同一段时称远标号,距离属性为FAR. 2 2 标号的定义 标号的定义有三种方法: 2 2 1 隐含说明标号距离属性为SHORT和NEAR的标号可以使用隐含说明,即在代码段中定义,标识符后加冒号,放在一条汇编指令的操作符前面.例: NEXT: MOV AX,BX ---------- LOOP NEXT - - - - - - - - - NEXT1: CMP AX,BX JA NEXT1 其中NEXT和NEXT1都是标号名. 2 2 2 用LABEL定义标号 对于属性为NEAR和FAR的标号均可以用这种定义.格式是: 标号名 LABEL NEAR/FAR 例如:NEXT LABEL NEAR/FAR - - - - - - - - - LOOP NEXT 2 2 3 用EQU定义标号 对于属性为NEAR和FAR的标号也可用EQU定义.格式是: 标号名 EQU THIS NEAT/FAR 例如: NEXT EQU THIS NEAR - - - - - - - - - LOOP NEXT 2 3 标号的使用 2 3 1 无条件转移指令中标号作为转移地址 格式: JMP 标号 其中标号可以是短标号,近标号或远标号 . 2 3 2 循环指令中,标号作为转移地址 格式:LOOP 标号 其中标号只能是短标号 2 3 3 条件转移中标号作为转移地址 格式: 条件转移指令 标号 其中标号只能用短标号 2 3 4 属性分离符 2 .3. 4. 1 取段地址算符SEG 例如:MOV AX,SEG NEXT SEG NEXT 就是取标号NEXT所在段的段地址. 2 3 4 2 取偏移量算符OFFSET 例如:MOV BX, OFFSET NEX 其中OFFSET NEXT就是取标号NEXT的有效地址,该语句等效于:LEA BX, NEXT 2 3 4 3 取类型算符TYPE 例如: MOV AX, TYPE NEXT 若NEXT为近标号,则TYPE NEXT值为FFFFH(-1),若NEXT为远标号TYPE NEXT值为FFFEH(-2).其中-1和-2无真正的物理意义,仅以数值表示标号类型而已.
变量 变量(Variable)代表存放在某些存储单元的数据,这些数据在程序运行期间可以随时被修改.变量是通过变量名在程序中引用,变量名实际上是存储区中一个数据区的名字,以变量名数据的方式供程序员使用,作为指令或伪.指令的操作数,大大方便了程序设计者. 由于变量是在逻辑段中定义.这就决定了变量和标号一样具有段属性、偏移属性和类型属性,前两个和标号的属性相同,而类型属性是指出数据区的数据项的存取单位是字节(BYTE),字(WORD)或数字(DWORD)等.可见变量和标号的主要区别在于变量指的是数据,而标号则对应的是指令 .3 1 变量的定义 变量通常也有三种定义法 .3 1 1 用伪指令DB,DW,DD等来定义 格式:[变量名] 定义数据伪指令〈表达式〉 其中变量名可有可无,若没有名字则该变量为无名变量.表达式可以是常数、保留符号"?"、ASCII码字符串(只能用DB定义)、地址表达式(不能用DB定义)、预置数据表格和用DUP定义的重复值.变量名可在任一逻辑段中定义,其后边不紧跟冒号而是加一空格 .例如:A DB 100;A为一个字节,值为100. B DB 100,2 3;B值为100,B+1的值为6. C DB 'ABC';C的值为41H,C+1的值为42H,C+2的值为43H.D DB ?; D是一个字节,预留一个字节,可以置入任何内容. E DB 23 DUP(0);定义23个0,每一个0占一个字节. F DB 3 DUP(1,2 DUP(0));定义9个数,顺序为:1,0,0,1,0,0,1,0,0. G DW 'AB','CD';G的值为4142H,G+2的值为4344H. H DW 2 3;H为一个字,存放顺序为06,00H I DW ? 预留一个字,占两个字节单元, 3 1 2 用伪指令LABEL定义变量 格式: 变量名 LABEL BYTE/WORD/DWORD 例如: BUF LABEL BYTE DB 21 它等价于 BUF DB 21 3 1 3 用伪指令EQU定义变量 格式:变量名 EQ
push ds: 将ds寄存器推入堆栈,要再次得到ds的值的时候可以用pop ds,即临时保存一下ds的值 sub ax,ax: 用ax-ax,也就是将ax清零 push ax: 与push ds相同 顺便说明一下,堆栈是后进先出的,所以,你如果先后执行了push ds和push ax,那么,执行pop命令的时候,就应该先用pop ax,然后再用pop ds
PUSH 入栈
PUSH OP;把操作数OP压入堆栈。
操作:
SP=SP-2
WORD PTR SS:[SP]=OP
补充说明:WORD PTR SS:[SP]表示SS:SP所指向的字。即堆栈段的当前堆栈指针所指向的2字节的内存单元
格式:
PUSH REG
PUSH MEM
其中PUSH的操作数(REG或MEM)必须是16位,即2个字节。
——————————————————————————
POP出栈
POP OP;从堆栈读取2字节的数据到OP。出栈是入栈的反过程。
操作:
OP=WORD PTR SS:[SP]
SP=SP+2
补充说明:OP也必须是2字节的
格式:
POP REG
POP MEM
——————————————————————————
PUSH和POP的操作数OP都必须是16位的,并且不可以是立即数。只能是寄存器或内存单元。
并且,POP的操作数不可以是CS,CS是只读的。可以PUSH CS,却不可以POP CS。
PUSH和POP都不影响标志位。
——————————————————————————
XCHG 交换(Exchange)
XCHG OP1,OP2;将OP1和OP2的数据对换
操作:
X=OP1
OP1=OP2
OP2=X
补充说明:XCHG不影响标志位,OP中不能有段寄存器。
伪指令格式: 过程名 PROC [类型] ...过程体语句 RET 过程名 ENDP
如果子程序和调用程序在一个段内,类型参数设置为near 如果子程序和调用程序不在一个段内,类型参数设置为far
一、状态寄存器 PSW(Program Flag)程序状态字寄存器,是一个16位寄存器,由条件码标志(flag)和控制标志构成,如下所示: 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 OF DF IF TF SF ZF AF PF CF 条件码: ①OF(Overflow Flag)溢出标志。溢出时为1,否则置0。 ②SF(Sign Flag)符号标志。结果为负时置1,否则置0. ③ZF(Zero Flag)零标志,运算结果为0时ZF位置1,否则置0. ④CF(Carry Flag)进位标志,进位时置1,否则置0. ⑤AF(Auxiliary carry Flag)辅助进位标志,记录运算时第3位(半个字节)产生的进位置。有进位时1,否则置0. ⑥PF(Parity Flag)奇偶标志。结果操作数中1的个数为偶数时置1,否则置0. 控制标志位: ⑦DF(Direction Flag)方向标志,在串处理指令中控制信息的方向。 ⑧IF(Interrupt Flag)中断标志。 ⑨TF(Trap Flag)陷井标志。 二、 直接标志转移 指令格式 机器码 测试条件 如...则转移 指令格式 机器码 测试条件 如...则转移 JC 72 C=1 有进位 JNS 79 S=0 正号 JNC 73 C=0 无进位 JO 70 O=1 有溢出 JZ/JE 74 Z=1 零/等于 JNO 71 O=0 无溢出 JNZ/JNE 75 Z=0 不为零/不等于 JP/JPE 7A P=1 奇偶位为偶 JS 78 S=1 负号 JNP/IPO 7B P=0 奇偶位为奇 三、间接标志转移 指令格式 机器码 测试格式 如...则转移 JA/JNBE(比较无符号数) 77 C或Z=0 > 高于/不低于或等于 JAE/JNB(比较无符号数) 73 C=0 >= 高于或等于/不低于 JB/JNAE(比较无符号数) 72 C=1 < 低于/不高于或等于 JBE/JNA(比较无符号数) 76 C或Z=1 <= 低于或等于/不高于 JG/JNLE(比较带符号数) 7F (S异或O)或Z=0 > 大于/不小于或等于 JGE/JNL(比较带符号数) 7D S异或O=0 >= 大于或等于/不小于 JL/JNGE(比较带符号数) 7C S异或O=1 < 小于/不大于或等于 JLE/JNG(比较带符号数) 7E (S异或O)或Z=1 <= 小于或等于/不大于 四、无条件转移指令JMP 指令格式 执行操作 机器码 说明 段内直接短转移 Jmp short (IP)←(IP)+8位位移量 EB 转移范围-128到+127字节 段内直接近转移Jmp near (IP)←(IP)+16位位移量 E9 转移到段内的任一位置 段内间接转移Jmp word (IP)←(有效地址EA) FF 段间直接(远)转移Jmp far (IP)←(偏移地址) (CS)←(段地址) EA 段间间接转移Jmp dword (IP)←(EA) (CS)←(EA+2)
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。 原始发表:2014-09-18,如有侵权请联系 cloudcommunity@tencent 删除程序数据汇编语言变量测试常用汇编指令
mov ah,2 int 21h 输出单个字符 mov ah,9 int 21h 输出字符串与DX联用!
mov ah,4ch int 21h 这是返回DOS
计算机汇编语言的一个突出优点就是利用符号(Symbol)来代替目标码,也即大量的二进制代码用符号来表示,使汇编语言源程序容易理解,便于记忆. 在宏汇编语言中所有变量名、标号名、记录名、指令助记符和寄存器名等统称符号.这些符号可通过汇编控制语句的伪操作命令重新命名,也可以通过指令给它定义其它名字及新的类型属性,因而给程序设计带来很大的灵活性.符号是程序员在程序中用来代表某个存储单元、数据、表达式和名字等所定义的标识符,可分为寄存器、标号、变量、数字、名字五类. 汇编语句形式: START: ADD AX,BUFFER DATA SEGMENT BUFFER DB 01H, 02H DATA ENDS JMP START其中START,BUFFER,DATA均为符号,它们分别表示标号,变量名,段名,它们具有完全不同的特定含意.
标号 标号(LABEL)是为一组机器指令所起的名字.标号可有可无,只有当需要用符号地址来访问该语句时,才给此语句赋予标号.标号是程序的目标标志,总是和某地址相联系,供转移或循环指令控制转移使用. 2 1 标号的属性 因标号表示的是指令地址,所以它有三个属性,即段属性、偏移属性和类型属性.段属性即段地址,标号的段必须在CS中.偏移属性是表示该标号到段首地址的距离,单位是字节,是16位无符号整数.类型属性是距离属性,指标号和转移指令的距离,该标号在本段内引用,距离在-128~+127之间时称短标号,距离属性为SHORT,当标号在本段,距离在-32768~+32767之间时称近标号,距离属性为NEAT,当引用标号的指令和标号不在同一段时称远标号,距离属性为FAR. 2 2 标号的定义 标号的定义有三种方法: 2 2 1 隐含说明标号距离属性为SHORT和NEAR的标号可以使用隐含说明,即在代码段中定义,标识符后加冒号,放在一条汇编指令的操作符前面.例: NEXT: MOV AX,BX ---------- LOOP NEXT - - - - - - - - - NEXT1: CMP AX,BX JA NEXT1 其中NEXT和NEXT1都是标号名. 2 2 2 用LABEL定义标号 对于属性为NEAR和FAR的标号均可以用这种定义.格式是: 标号名 LABEL NEAR/FAR 例如:NEXT LABEL NEAR/FAR - - - - - - - - - LOOP NEXT 2 2 3 用EQU定义标号 对于属性为NEAR和FAR的标号也可用EQU定义.格式是: 标号名 EQU THIS NEAT/FAR 例如: NEXT EQU THIS NEAR - - - - - - - - - LOOP NEXT 2 3 标号的使用 2 3 1 无条件转移指令中标号作为转移地址 格式: JMP 标号 其中标号可以是短标号,近标号或远标号 . 2 3 2 循环指令中,标号作为转移地址 格式:LOOP 标号 其中标号只能是短标号 2 3 3 条件转移中标号作为转移地址 格式: 条件转移指令 标号 其中标号只能用短标号 2 3 4 属性分离符 2 .3. 4. 1 取段地址算符SEG 例如:MOV AX,SEG NEXT SEG NEXT 就是取标号NEXT所在段的段地址. 2 3 4 2 取偏移量算符OFFSET 例如:MOV BX, OFFSET NEX 其中OFFSET NEXT就是取标号NEXT的有效地址,该语句等效于:LEA BX, NEXT 2 3 4 3 取类型算符TYPE 例如: MOV AX, TYPE NEXT 若NEXT为近标号,则TYPE NEXT值为FFFFH(-1),若NEXT为远标号TYPE NEXT值为FFFEH(-2).其中-1和-2无真正的物理意义,仅以数值表示标号类型而已.
变量 变量(Variable)代表存放在某些存储单元的数据,这些数据在程序运行期间可以随时被修改.变量是通过变量名在程序中引用,变量名实际上是存储区中一个数据区的名字,以变量名数据的方式供程序员使用,作为指令或伪.指令的操作数,大大方便了程序设计者. 由于变量是在逻辑段中定义.这就决定了变量和标号一样具有段属性、偏移属性和类型属性,前两个和标号的属性相同,而类型属性是指出数据区的数据项的存取单位是字节(BYTE),字(WORD)或数字(DWORD)等.可见变量和标号的主要区别在于变量指的是数据,而标号则对应的是指令 .3 1 变量的定义 变量通常也有三种定义法 .3 1 1 用伪指令DB,DW,DD等来定义 格式:[变量名] 定义数据伪指令〈表达式〉 其中变量名可有可无,若没有名字则该变量为无名变量.表达式可以是常数、保留符号"?"、ASCII码字符串(只能用DB定义)、地址表达式(不能用DB定义)、预置数据表格和用DUP定义的重复值.变量名可在任一逻辑段中定义,其后边不紧跟冒号而是加一空格 .例如:A DB 100;A为一个字节,值为100. B DB 100,2 3;B值为100,B+1的值为6. C DB 'ABC';C的值为41H,C+1的值为42H,C+2的值为43H.D DB ?; D是一个字节,预留一个字节,可以置入任何内容. E DB 23 DUP(0);定义23个0,每一个0占一个字节. F DB 3 DUP(1,2 DUP(0));定义9个数,顺序为:1,0,0,1,0,0,1,0,0. G DW 'AB','CD';G的值为4142H,G+2的值为4344H. H DW 2 3;H为一个字,存放顺序为06,00H I DW ? 预留一个字,占两个字节单元, 3 1 2 用伪指令LABEL定义变量 格式: 变量名 LABEL BYTE/WORD/DWORD 例如: BUF LABEL BYTE DB 21 它等价于 BUF DB 21 3 1 3 用伪指令EQU定义变量 格式:变量名 EQ
push ds: 将ds寄存器推入堆栈,要再次得到ds的值的时候可以用pop ds,即临时保存一下ds的值 sub ax,ax: 用ax-ax,也就是将ax清零 push ax: 与push ds相同 顺便说明一下,堆栈是后进先出的,所以,你如果先后执行了push ds和push ax,那么,执行pop命令的时候,就应该先用pop ax,然后再用pop ds
PUSH 入栈
PUSH OP;把操作数OP压入堆栈。
操作:
SP=SP-2
WORD PTR SS:[SP]=OP
补充说明:WORD PTR SS:[SP]表示SS:SP所指向的字。即堆栈段的当前堆栈指针所指向的2字节的内存单元
格式:
PUSH REG
PUSH MEM
其中PUSH的操作数(REG或MEM)必须是16位,即2个字节。
——————————————————————————
POP出栈
POP OP;从堆栈读取2字节的数据到OP。出栈是入栈的反过程。
操作:
OP=WORD PTR SS:[SP]
SP=SP+2
补充说明:OP也必须是2字节的
格式:
POP REG
POP MEM
——————————————————————————
PUSH和POP的操作数OP都必须是16位的,并且不可以是立即数。只能是寄存器或内存单元。
并且,POP的操作数不可以是CS,CS是只读的。可以PUSH CS,却不可以POP CS。
PUSH和POP都不影响标志位。
——————————————————————————
XCHG 交换(Exchange)
XCHG OP1,OP2;将OP1和OP2的数据对换
操作:
X=OP1
OP1=OP2
OP2=X
补充说明:XCHG不影响标志位,OP中不能有段寄存器。
伪指令格式: 过程名 PROC [类型] ...过程体语句 RET 过程名 ENDP
如果子程序和调用程序在一个段内,类型参数设置为near 如果子程序和调用程序不在一个段内,类型参数设置为far
一、状态寄存器 PSW(Program Flag)程序状态字寄存器,是一个16位寄存器,由条件码标志(flag)和控制标志构成,如下所示: 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 OF DF IF TF SF ZF AF PF CF 条件码: ①OF(Overflow Flag)溢出标志。溢出时为1,否则置0。 ②SF(Sign Flag)符号标志。结果为负时置1,否则置0. ③ZF(Zero Flag)零标志,运算结果为0时ZF位置1,否则置0. ④CF(Carry Flag)进位标志,进位时置1,否则置0. ⑤AF(Auxiliary carry Flag)辅助进位标志,记录运算时第3位(半个字节)产生的进位置。有进位时1,否则置0. ⑥PF(Parity Flag)奇偶标志。结果操作数中1的个数为偶数时置1,否则置0. 控制标志位: ⑦DF(Direction Flag)方向标志,在串处理指令中控制信息的方向。 ⑧IF(Interrupt Flag)中断标志。 ⑨TF(Trap Flag)陷井标志。 二、 直接标志转移 指令格式 机器码 测试条件 如...则转移 指令格式 机器码 测试条件 如...则转移 JC 72 C=1 有进位 JNS 79 S=0 正号 JNC 73 C=0 无进位 JO 70 O=1 有溢出 JZ/JE 74 Z=1 零/等于 JNO 71 O=0 无溢出 JNZ/JNE 75 Z=0 不为零/不等于 JP/JPE 7A P=1 奇偶位为偶 JS 78 S=1 负号 JNP/IPO 7B P=0 奇偶位为奇 三、间接标志转移 指令格式 机器码 测试格式 如...则转移 JA/JNBE(比较无符号数) 77 C或Z=0 > 高于/不低于或等于 JAE/JNB(比较无符号数) 73 C=0 >= 高于或等于/不低于 JB/JNAE(比较无符号数) 72 C=1 < 低于/不高于或等于 JBE/JNA(比较无符号数) 76 C或Z=1 <= 低于或等于/不高于 JG/JNLE(比较带符号数) 7F (S异或O)或Z=0 > 大于/不小于或等于 JGE/JNL(比较带符号数) 7D S异或O=0 >= 大于或等于/不小于 JL/JNGE(比较带符号数) 7C S异或O=1 < 小于/不大于或等于 JLE/JNG(比较带符号数) 7E (S异或O)或Z=1 <= 小于或等于/不大于 四、无条件转移指令JMP 指令格式 执行操作 机器码 说明 段内直接短转移 Jmp short (IP)←(IP)+8位位移量 EB 转移范围-128到+127字节 段内直接近转移Jmp near (IP)←(IP)+16位位移量 E9 转移到段内的任一位置 段内间接转移Jmp word (IP)←(有效地址EA) FF 段间直接(远)转移Jmp far (IP)←(偏移地址) (CS)←(段地址) EA 段间间接转移Jmp dword (IP)←(EA) (CS)←(EA+2)
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。 原始发表:2014-09-18,如有侵权请联系 cloudcommunity@tencent 删除程序数据汇编语言变量测试本文标签: 常用汇编指令
版权声明:本文标题:常用汇编指令 内容由热心网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://it.en369.cn/jiaocheng/1747952204a2232711.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论