c-OpenWatcom内联组件中的额外推送



我正在用OpenWatcom V2wcc:编译这个C源代码

/* Writes a ''-terminated string to the file descriptor. */
static void fdputs(int fd, const char *s);
#pragma aux fdputs = 
"push si" 
"mov cx, -1" 
"repz scasb" 
"neg cx" 
"inc cx"  /* now cx is the number of bytes to write */ 
"pop dx"  /* now dx points to the buffer (s argument) */ 
"mov ah, 0x40" /* WRITE */ 
"int 0x21" 
parm [ bx si ] 
modify [ ax cx dx si ];  /* Also modifies cf */
int myfunc(void) {
fdputs(1, "Hello!");
return 0;
}

在wcc生成的.obj文件的可分解性中,6个pushes和5个pops不平衡。(代码运行时会因此崩溃。(

$ wcc -bt=dos -ms -s -os -W -w4 -wx -we -wcd=202 -0 -fr -fo=t.obj t.c
$ wdis -a -fi -i=@ t.obj
.387
PUBLIC  myfunc_
EXTRN   _small_code_:BYTE
DGROUP          GROUP   CONST,CONST2,_DATA
_TEXT           SEGMENT BYTE PUBLIC USE16 'CODE'
ASSUME CS:_TEXT, DS:DGROUP, SS:DGROUP
myfunc_:
push            bx
push            cx
push            dx
push            si
mov             ax,offset DGROUP:@$1
push            ax
mov             bx,1
xor             si,si
push            si
mov             cx,0ffffH
repe scasb
neg             cx
inc             cx
pop             dx
mov             ah,40H
int             21H
xor             ax,ax
pop             si
pop             dx
pop             cx
pop             bx
ret
_TEXT           ENDS
CONST           SEGMENT WORD PUBLIC USE16 'DATA'
@$1:
DB  48H, 65H, 6cH, 6cH, 6fH, 21H, 0
CONST           ENDS
CONST2          SEGMENT WORD PUBLIC USE16 'DATA'
CONST2          ENDS
_DATA           SEGMENT WORD PUBLIC USE16 'DATA'
_DATA           ENDS
END

我是否正确使用wcc内联程序集?这可能是wcc中的错误吗?

我认为这是OpenWatcom C/C++的一个错误,因为我过去曾观察到这种行为。为了避免这种情况,我在它们自己的[]之间分别列出了每个参数。尝试修改:

parm [ bx si ] 

将:

parm [ bx ] [ si ] 

生成的代码应该看起来像:

.387
PUBLIC  myfunc_
EXTRN   _small_code_:BYTE
DGROUP          GROUP   CONST,CONST2,_DATA
_TEXT           SEGMENT BYTE PUBLIC USE16 'CODE'
ASSUME CS:_TEXT, DS:DGROUP, SS:DGROUP
myfunc_:
push            bx
push            cx
push            dx
push            si
mov             si,offset DGROUP:@$1
mov             bx,1
push            si
mov             cx,0ffffH
repe scasb
neg             cx
inc             cx
pop             dx
mov             ah,40H
int             21H
xor             ax,ax
pop             si
pop             dx
pop             cx
pop             bx
ret
_TEXT           ENDS
CONST           SEGMENT WORD PUBLIC USE16 'DATA'
@$1:
DB  48H, 65H, 6cH, 6cH, 6fH, 21H, 0
CONST           ENDS
CONST2          SEGMENT WORD PUBLIC USE16 'DATA'
CONST2          ENDS
_DATA           SEGMENT WORD PUBLIC USE16 'DATA'
_DATA           ENDS
END

使用AX寄存器传输const char *s的地址以及没有相应pop的额外push ax被删除。

相关内容

  • 没有找到相关文章

最新更新