以下是我尝试编译和执行的示例代码,以便我可以更好地理解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
答案 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的其余部分保持不变。