test后跟je(转载)

test后跟je
2009-04-22 22:07

今天俺也用OD(OllyDbg)反汇编了个小软件,其中里面有下面两条指令:

 

没太明白什么意思,google一下,在看雪论坛上发现了一个大虾的解释很详细,记录一下:

1.test a,b 是a与b相与的意思,不是检查a,b是否相等。故test eax,eax是检查eax是否为零。
1.test可以影响cf,of,pf,sf,zf标志位。
2.JE当zf为零时跳转。
3.jz和je是同一条指令的两个不同记号而已。

补充:


1.test a,b是做 AND 运算(虽然通常是用来测试结果是否为零,但不限于此,比如一些位掩码操作,或者正负号判断等),但不把结果写回目的操作数,仅根据结果的值来置标志位。

2.je/jz 是 当运算结果为0时则跳,也就是当EFLAGS中的ZF标志为1时跳转。ZF标志为1,说明上一次运算(不管是算术运算还是逻辑运算)结果为0,而ZF为0,说明运算结果非0。

那 test eax,eax 放到这程序里面对于验证是否注册有什么意义呢?为什么要检测这个值是不是零呢?

因为EAX中是前一步的计算结果(比如验证是否成功),要判断验证是否成功,当然就等于判断EAX中的值了。当然,理论上不一定要和0比较,也可以进行其它的判断,但在这种情况下通常是一种bool型的值,在C中没有bool这种类型,而是把0作为false,把任何非0值作为true,所以这里就要判断它是true还是false,也就是判断它是不是为零了。

转自:http://hi.baidu.com/felixzxh/blog/item/bb7c8ec910f6491f7e3e6f54.html

; 修正后的完整程序 .MODEL SMALL .STACK 100H .DATA PROMPT DB '请输入身份证号(18位): $' ERROR_MSG DB 0DH,0AH,'身份证号错误!$' VALID_MSG DB 0DH,0AH,'身份证号有效!$' BIRTH_MSG DB 0DH,0AH,'出生日期: $' GENDER_MSG DB 0DH,0AH,'性别: $' PROVINCE_MSG DB 0DH,0AH,'省份: $' ID_BUFFER DB 19 ; 最大长度 DB ? ; 实际长度 DB 19 DUP('$') ; 初始化缓冲区 WEIGHTS DB 7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2 CHECK_CODES DB '10X98765432' PROVINCES DB '11','北京市$' DB '44','广东省$' DB '31','上海市$' DB 00H ; 结束标记 BIRTH_DATE DB 'YYYYMMDD$' GENDER DB '男$','女$' UNKNOWN_PROV DB '未知地区$' .CODE START: MOV AX, @DATA MOV DS, AX ; 显示输入提示 MOV AH, 09H LEA DX, PROMPT INT 21H ; 读取身份证号 MOV AH, 0AH LEA DX, ID_BUFFER INT 21H ; 验证长度 CMP [ID_BUFFER+1], 18 JNE INVALID ; 验证前17位为数字 MOV CX, 17 LEA SI, ID_BUFFER+2 CHECK_DIGITS: MOV AL, [SI] CMP AL, '0' JB INVALID CMP AL, '9' JA INVALID INC SI LOOP CHECK_DIGITS ; 验证校验位(增加大小写转换) CALL CALC_CHECK_DIGIT LEA SI, ID_BUFFER+2+17 MOV AH, [SI] ; 转换小写x为大写X CMP AH, 'x' JNE COMPARE_CHECK MOV AH, 'X' COMPARE_CHECK: CMP AL, AH JNE INVALID ; 显示有效信息 MOV AH, 09H LEA DX, VALID_MSG INT 21H ; 提取出生日期 LEA SI, ID_BUFFER+2+6 LEA DI, BIRTH_DATE MOV CX, 8 COPY_BIRTH: MOV AL, [SI] MOV [DI], AL INC SI INC DI LOOP COPY_BIRTH ; 显示出生日期 MOV AH, 09H LEA DX, BIRTH_MSG INT 21H LEA DX, BIRTH_DATE INT 21H ; 查找省份 CALL FIND_PROVINCE ; 判断性别 LEA SI, ID_BUFFER+2+16 MOV AL, [SI] SUB AL, '0' TEST AL, 1 JZ FEMALE ; 显示男性 MOV AH, 09H LEA DX, GENDER_MSG INT 21H LEA DX, GENDER INT 21H JMP EXIT FEMALE: ; 显示女性 MOV AH, 09H LEA DX, GENDER_MSG INT 21H LEA DX, GENDER+3 ; 修正偏移量 INT 21H EXIT: MOV AH, 4CH INT 21H INVALID: MOV AH, 09H LEA DX, ERROR_MSG INT 21H JMP EXIT ; 计算校验位子程序(优化寄存器使用) CALC_CHECK_DIGIT PROC NEAR PUSH BX PUSH CX MOV CX, 17 LEA SI, ID_BUFFER+2 LEA DI, WEIGHTS XOR BX, BX CALC_LOOP: MOV AL, [SI] SUB AL, '0' MUL BYTE PTR [DI] ADD BX, AX INC SI INC DI LOOP CALC_LOOP MOV AX, BX MOV CL, 11 DIV CL LEA SI, CHECK_CODES XOR BH, BH MOV BL, AH MOV AL, [SI+BX] POP CX POP BX RET CALC_CHECK_DIGIT ENDP ; 查找省份子程序(优化搜索逻辑) FIND_PROVINCE PROC NEAR PUSH SI LEA SI, ID_BUFFER+2 MOV AX, [SI] LEA DI, PROVINCES SEARCH_LOOP: CMP BYTE PTR [DI], 0 JE NOT_FOUND CMP AX, [DI] JE FOUND_PROV ADD DI, 2 SKIP_PROV: CMP BYTE PTR [DI], '$' JE NEXT_PROV INC DI JMP SKIP_PROV NEXT_PROV: INC DI JMP SEARCH_LOOP FOUND_PROV: ADD DI, 2 MOV AH, 09H LEA DX, PROVINCE_MSG INT 21H MOV DX, DI INT 21H POP SI RET NOT_FOUND: MOV AH, 09H LEA DX, PROVINCE_MSG INT 21H LEA DX, UNKNOWN_PROV INT 21H POP SI RET FIND_PROVINCE ENDP END START这里出错(13) unterminated string: " (13) mismatched or misplaced quotes
05-11
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值