在装配问题中添加和减去

时间:2016-09-11 03:05:38

标签: assembly x86 masm irvine32

以下是我尝试编译和执行的示例代码,以便我可以更好地理解Assembly中的算术。我遇到的这个问题是为什么我得到-32641作为值而不是-36?谢谢。 的 EDITED

TITLE  Addition and Subtraction        (AddSub3.asm)

; Chapter 4 example. Demonstration of ADD, SUB,
; INC, DEC, and NEG instructions, and how
; they affect the CPU status flags.
; Last update: 2/1/02

INCLUDE Irvine32.inc

.data
Rval SDWORD ?
Xval SDWORD 26
Yval SDWORD 30
Zval SDWORD 40

.code
main PROC

    ; INC and DEC
    mov ax,1000h
    inc ax      ; 1001h
    dec ax      ; 1000h

    ; Expression: Rval = -Xval + (Yval - Zval)
    mov  eax,Xval
    neg  eax        ; -26
    mov  ebx,Yval
    sub  ebx,Zval       ; -10
    add  eax,ebx
    mov  Rval,eax       ; -36

    ; Zero flag example:
    mov cx,1
    sub cx,1        ; ZF = 1
    mov ax,0FFFFh
    inc ax      ; ZF = 1

    ; Sign flag example:
    mov cx,0
    sub cx,1        ; SF = 1
    mov ax,7FFFh
    add ax,2        ; SF = 1

    ; Carry flag example:
    mov al,0FFh
    add al,1        ; CF = 1,  AL = 00

    ; Overflow flag example:
    mov  al,+127
    add  al,1       ; OF = 1
    mov  al,-128
    sub  al,1       ; OF = 1

    call writeint
    exit
main ENDP
END main

1 个答案:

答案 0 :(得分:2)

function firstNonRepeatingLetter(s) { //input string //return first character that doesn't repeat anywhere else. //parent for loop points to the char we are analyzing //child for loop iterates over the remainder of the string //if child for loop doesnt find a repeat, return the char, else break out of the child for loop and cont if (s.length == 1) { return s;} for (var i = 0; i < s.length - 1; i++){ //parent loop var elem = s[i]; var f=false; for (var j = i + 1; j < s.length; j++){ if (elem == s[j]){ f=true; break; } } if( f!=true) return s[i]; } return ""; } console.log(firstNonRepeatingLetter('stress')); // should output t, getting s. 的第一个谷歌搜索告诉你它需要一个无符号的arg,并且Irvine32 writedec采用一个带符号的32位参数。

由于这些函数会打印完整的32位eax寄存器,这意味着您需要将数字符号扩展到完整的eax中。

您打印的值是0xffff807f(十六进制)。该WriteInt被解释为有符号整数(2&#39补,谷歌)。

Irvine32函数在eax,IIRC中首次使用它们。

你运行几条修改AX的指令,然后在eax中有一个小的负整数后修改AL,所以高16位是0xffff。我没有完成后续指令对低2字节,然后是1字节eax的详细信息,但它看起来并不是很清晰。

我假设你没有意识到AX和AL是EAX的子集,或者写它们只是让EAX的其余部分保持不变。

有关详细信息,请参阅。此外,标记维基用于链接,有助于在问题出现之前纠正其他基本误解。 :)