回 帖 发 新 帖 刷新版面

主题:这些指令怎么被翻译成这样了

data    segment
var1    dw    5 dup(?)
var2    dw    20H,30H
data    ends
code    segment
        assume    cs:code,ds:data
start:  mov    ax,data
        mov    ds,ax
        mov    ax,[var2]
        mov    bx,var2
        mov    cx,[offset    var2]
        mov    dx,offset    var2    
        mov    si,0ah
        mov    di,[000ah]
        mov    ah,4ch
        int    21h
     
code    ends
        end    start
用codeview调试发现程序被翻译成这样了:

[img]http://tk.files.storage.msn.com/x1pIuxx1VYmtQuzFQENYebLyIDV8km488Qkix0_1RAM8aUh6wL3jKSGDxidST8lUpoh75H8V_E6zslSjxgX-6NUAs-6T4BlPNvNBdjY5VVOsCIGNNiD0FuNJ8KpvXhJEzTg9uGnEhxaY7g[/img]

回复列表 (共3个回复)

沙发

mov    si,0ah
mov    di,[000ah]
怎么一样了都是mov    si,0000a
        mov    di,0000a

板凳

data    segment
var1    dw    5 dup(?)
var2    dw    20H,30H
data    ends
code    segment
        assume    cs:code,ds:data
start:  mov    ax,data
        mov    ds,ax
        mov    ax,[var2]
        mov    bx,var2
        mov    cx,[offset    var2]
        mov    dx,offset    var2    
        mov    si,0ah
        mov    di,[000ah]
        mov    ah,4ch
        int    21h
     
code    ends
        end    start
用codeview反汇编发现程序被翻译成这样了:
0B6F:0000 B86E0B        MOV     AX,0B6E
0B6F:0003 8ED8          MOV     DS,AX
0B6F:0005 A10C00        MOV     AX,[000C]
0B6F:0008 8B1E0C00      MOV     BX,[000C]
0B6F:000C B90C00        MOV     CX,000C
0B6F:000F BA0C00        MOV     DX,000C
0B6F:0012 BE0A00        MOV     SI,000A
0B6F:0015 BF0A00        MOV     DI,000A
0B6F:0018 B44C          MOV     AH,4C
0B6F:001A CD21          INT     21
 
 
mov    si,0ah
mov    di,[000ah]
SI和DI寄存器中最终都被放入了0000ah
怎么会这样也说不太清楚,最终可能会是编译器不支持这种写法,若改为mov    di,ds:[000ah]则能被正常反汇编成
0B6F:0000 B86E0B        MOV     AX,0B6E
0B6F:0003 8ED8          MOV     DS,AX
0B6F:0005 A10C00        MOV     AX,[000C]
0B6F:0008 8B1E0C00      MOV     BX,[000C]
0B6F:000C B90C00        MOV     CX,000C
0B6F:000F BA0C00        MOV     DX,000C
0B6F:0012 BE0A00        MOV     SI,000A
0B6F:0015 8B3E0A00      MOV     DI,[000A]
0B6F:0019 B44C          MOV     AH,4C
0B6F:001B CD21          INT     21
还有一点就是把 mov    di,[000ah]中的000ah存放于基址或变址寄存器中,这样也可以被反汇编成我们想要的代码

3 楼

mov    di,[000ah]中的000ah存放于基址或变址寄存器中,这样也可以被反汇编成我们想要的代码.
这个是不对的,要不你把上面的代码修改为mov bx,[000ah]看看。
正如你说的,这个问题估计是编译器的问题。

我来回复

您尚未登录,请登录后再回复。点此登录或注册