x86, difference between BYTE and BYTE PTR

前端 未结 3 2112
眼角桃花
眼角桃花 2020-11-30 06:21

What is the difference between these two lines? What PTR changes here?

;first
mov BYTE [ecx], 0  
;second
mov BYTE PTR [ecx], 0
3条回答
  •  情书的邮戳
    2020-11-30 07:21

    In MASM, BYTE PTR [ecx] accesses memory at address ecx. BYTE [ecx] is a syntax error ("inline assembler syntax error in 'first operand'; found '['").

    In NASM or YASM, BYTE [ecx] accesses memory at address ecx. BYTE PTR [ecx] is a syntax error ("error: comma, colon or end of line expected" in NASM, "undefined symbol `PTR'" in YASM).

    In TASM, BYTE PTR [ecx] and BYTE [ecx] are equivalent--both access memory at address ecx.

    However, in the Gnu assembler gas, when using the intel syntax BYTE PTR [ecx] accesses memory at ecx, but BYTE [ecx] actually accesses memory at address ecx+1. That is, BYTE [ecx] is equivalent to BYTE PTR [ecx+1], which does not appear to be either sane or documented.

    Gnu assembler version 2.18, 2.24, or 2.26.1:

    cat > foo.S << EOF
    .intel_syntax noprefix
     movb BYTE [ecx], 0 
     movb BYTE PTR [ecx], 0 
    .att_syntax prefix
    EOF
    
    as foo.S
    objdump -dM intel a.out
    
    0:  67 c6 41 01 00          mov    BYTE PTR [ecx+0x1],0x0
    5:  67 c6 01 00             mov    BYTE PTR [ecx],0x0
    

提交回复
热议问题