2013-09-24 5 views
1

a, b, c, d 이 부호있는 8 개의 데이터 세그먼트에 저장된 변수 인 (a * (bc) * d)를 계산하는 어셈블리 프로그램을 작성해야합니다. 비트 형식. 다음과 같이 는x86 어셈블러. 부호있는 변수와 부호없는 변수와 8과 16 변수의 차이

는 다음 코드

내 질문에

data segment 

    a db 1 
    b db 9 
    c db 3 
    d db 4 

    x dw ? 


ends 

stack segment 
    dw 128 dup(0) 
ends 

code segment 
start: 

    mov ax, data 
    mov ds, ax 
    mov es, ax 


    ; what would the difference be in the following three lines if the variables where signed? 
    mov al, b 
    sub al,c 
    mul a 
    mul d 


    ;treating result as a 16bit - how about signed? 
    mov x,ax 





    mov ax, 4c00h ; exit to operating system. 
    int 21h  
ends 

end start 
에게 쓴 있습니다 (I는 결과가 부호있는 32 비트 숫자로 표현되어 있다고 가정해야한다) : 내가 필요의 차이는 무엇입니까 (al, ah, bh, bl, ecc ... 8bit), (ax, bx, cd, dx, 16bit)를 제외하고 숫자를 서명하고 서명 한 것으로 취급하는 경우를 알고 싶습니까?

DW 변수를 저장하는 것과 별도로 32 비트 변수를 16 변수와 다르게 취급하는 방법은 무엇입니까?

위의 질문에 대한 간단한 설명을 코드의 관련 부분에 작성했습니다.

누군가 제발 나를 도와주세요. 미리 감사드립니다.

답변

3

일반적으로 레지스터/메모리의 내용은 비트의 시퀀스 (특정 길이 포함) 일 뿐이며 부호/부호없는 개념은 부적합합니다.

연산자가 부호가 있거나 부호가없는 것으로 간주되어야하는지 여부가 중요한 몇 가지 지침이 있습니다. 몇 가지 예는 다음과 같습니다 서명되지 않은 피연산자를 사용 MUL, 서명 피연산자 IMUL :

  • 곱셈.
  • 구분 : 부호없는 피연산자에는 DIV을 사용하고 부호있는 피연산자에는 IDIV을 사용하십시오.
  • 조건부 점프 : JA 위의 경우 (부호없는) 점프를 의미합니다. JG은 (부호가있는) 점프를 의미합니다. JB은 아래의 (부호없는) 점프를 의미하고 JL은 점프 (서명 된) 점프를 의미합니다.
    ;treating result as a 16bit - how about signed? 
    mov x,ax 
    

    MOV


는 기호의 어떤 개념이 없다, 그것은 단지를 대상으로 복사 소스에서 비트. 알아야 할 것은 복사 할 비트 수 (즉, 피연산자의 크기)뿐입니다. 당신이 사용하는 경우

한 가지 예외는있는 MOV을 확대 :

movzx ax,byte ptr [foo] ; zero-extend the byte foo into ax (for unsigned numbers) 
movsx ax,byte ptr [foo] ; sign-extend the byte foo into ax (for signed numbers) 

가 어떻게 그것을 저장에서 떨어져, 16 변수와 다르게 32 비트 변수를 처리 할 것은 DW 변수를 이토 ?

DW은 16 비트 변수입니다. 32 비트 변수의 경우 DD을 사용합니다.