注册 登录
编程论坛 汇编论坛

伪指令.while判断有符号数,却被汇编成判断无符号数,如何修改

fxj_agame 发布于 2011-06-06 13:44, 749 次点击
data    segment
    array dw 1,2,5,8,0,9,22,-1
    average dw 0
data    ends

code    segment
    assume cs:code,ds:data
start:
    mov ax,data
    mov ds,ax
;------------------------
    lea si,array
    xor ax,ax
    xor dx,dx
    xor cx,cx
    mov bx,[si]
    .while (bx>=0);此处被汇编成cmp bx,0    jnb xxx。为什么不是汇编成jge xxx(xxx为add ax,bx地址)
        add ax,bx
        adc dx,0
        inc cx
        add si,type word
        mov bx,[si]
    .endw
    div cx
    mov average,ax
;-------------------
exit:
    mov ax,4c00h
    int 21h
code    ends
    end start
3 回复
#2
obstratiker2011-06-06 14:18
用寄存器进行比较的时候,编译器不能确定该值是有符号的还是没有符号的,所以默认用无符号的了
你在 .while 中用变量代替 bx ,比如 array[si] >= 0     (si 先置零)

另外定义数据时用
array sword 1,2,5,8,0,9,22,-1

这样就好了
#3
zklhp2011-06-06 15:30
以下是引用obstratiker在2011-6-6 14:18:53的发言:

用寄存器进行比较的时候,编译器不能确定该值是有符号的还是没有符号的,所以默认用无符号的了
你在 .while 中用变量代替 bx ,比如 array[si] >= 0     (si 先置零)

另外定义数据时用
array sword 1,2,5,8,0,9,22,-1

这样就好了

可以用sword ptr 让宏替换出你想要的指令。。
#4
fxj_agame2011-06-06 15:49
回复 3楼 zklhp
谢谢。
将.while(bx>=0)改成.while(sword ptr bx>=0),汇编后得jl的跳转指令,已解决。
1