어셈블러에 대한 그림 튜토리얼입니다. 조립 산술 명령어

ADC(캐리로 추가)는 그룹에 속합니다. 정수 명령(또는 바이너리)산수 (이진 산술 명령어) 두 개의 부호 있는 또는 부호 없는 피연산자의 정수 덧셈을 수행합니다( 목적지그리고 SRC) 그리고 깃발을 들고 EFLAGS.CF . 첫 번째 피연산자( 대상 피연산자, 목적지)는 레지스터나 메모리의 변수일 수 있습니다( , r16, r32 , r/m8, r/m16, r/m32). 두 번째 피연산자( 소스 피연산자, SRC) - 즉각적인 의미 ( imm8, imm16, imm32), 레지스터나 메모리의 변수입니다. 이 경우 두 피연산자는 동시에 메모리의 변수가 될 수 없습니다.

명령에 의한 추가 결과 ADC첫 번째 피연산자 위치에 배치됩니다( 목적지). EFLAGS 레지스터의 플래그는 결과에 따라 설정됩니다.

직접 값을 추가하는 경우 imm8또는 imm16 2바이트 또는 4바이트 피연산자의 경우 즉치값은 먼저 첫 번째 피연산자의 크기로 부호 확장된 다음에만 추가가 수행됩니다.

ADC일반적으로 멀티바이트 또는 멀티워드( 다중 단어) 추가 작업. 이 경우 멀티바이트(다중 단어) 피연산자의 하위 비트 합계를 반환하는 ADD 명령어를 따르므로 상위 비트를 추가할 때 캐리를 고려할 수 있습니다. 예를 들어:

이동 edx, 0 ; EDX = 0
이동 eax, 0FFFFFFFFh ; 첫 번째 32비트 가수는 EAX에 배치됩니다.
eax, 0FFFFFFFFh 추가; 두 번째 32비트 가수 - 0x FFFFFFFFh, 두 개의 32비트 피연산자를 추가합니다.
ADCEDX, 0 ; EDX = EDX + CF, 이월을 고려
; EDX:EAX = 0000000lh:FFFFFFFEh - 결과 64비트 결과

ADC다음과 같이 정수 피연산자를 조작할 수 있습니다. 부호 없는 형식, 그리고 서명된 형식. 부호가 있는 데이터를 추가하는 경우 서명 깃발 EFLAGS.SF는 얻은 결과의 부호를 반영합니다. 오버플로 플래그 EFLAGS.OF는 2의 보수 또는 2의 보수로 표시되는 부호 있는 정수 값을 추가할 때 오버플로가 발생하는 경우(부호 비트 앞의 비트가 해당하는 최상위 비트에서 전달됨), 즉 결과 결과가 피연산자 약속의 사용 가능한 크기를 초과합니다( 목적지). 본질적으로 이는 추가 시 EFLAGS.CF 플래그가 오버플로(캐리)를 반영하는 방식과 유사합니다. 부호 없는 피연산자. 예를 들어 역방향 코드로 표현된 두 개의 32비트 값을 추가하면 다음과 같을 수 있습니다.

mov eax, 피연산자1 ; EAX = 피연산자1, 첫 번째 32비트 가수가 EAX에 배치됩니다.
eax, 피연산자2 추가; 역방향 코드에 두 개의 32비트 피연산자를 추가합니다.
안으로 ; 오버플로가 발생하면 인터럽트 핸들러로 점프

ADC eax, 0 ; EAX = EAX + CF, 캐리 고려 (역코드 추가시 필요)
; EAX = 피연산자1 + 피연산자2 - 역방향 코드의 덧셈 결과
jnsm1; 결과가 긍정적인 경우 전환
xor eax, 7FFFFFFFFh ; EAX의 음수 값을 직선 코드로 변환
m1: ; EAX - 직접 코드에 추가한 결과

보조 깃발(또는 추가의)옮기다 EFLAGS.AF는 BCD 형식의 데이터를 조작하는 데 도움이 됩니다( 압축된 BCD 형식). 추가하는 동안 결과의 하위 바이트의 하위 4개에서 상위 4개로 캐리가 발생하는 경우 설정됩니다. 명령 바로 다음에 DAA 명령 사용 ADC, 소위 생산이 가능합니다 소수 정정덧셈의 ​​결과를 구하고 그 합을 동일하게 구합니다. 패키지된 BCD 형식, 원래 용어와 같습니다.

ADC대상 피연산자 포함( 목적지)는 메모리 변수인 LOCK 잠금 접두사와 함께 사용할 수 있으며 이는 명령의 원자 실행을 보장합니다.

추가 명령 - ADD, ADC

ADD(더하기) 및 ADC(캐리 포함 추가) 명령어는 8비트 및 16비트 피연산자를 모두 추가할 수 있습니다.

ADD 명령어는 소스 피연산자와 대상 피연산자의 내용을 더하고 결과를 대상 피연산자에 배치합니다.

명령 형식: ADD 수신기, 소스

기호 표기법에서 해당 작업은 다음과 같이 설명할 수 있습니다. 싱크:= 싱크 + 소스(싱크와 소스의 콘텐츠 합계가 싱크에 기록됩니다).

ADC 명령은 ADD 명령과 동일하지만 두 개가 아닌 세 개의 용어(대상, 소스 및 캐리 플래그)를 추가합니다.

명령 형식: ADC 수신기, 소스 + CF

기호 표기법에서는 해당 동작을 다음과 같이 설명할 수 있습니다.

싱크:= 싱크 + 소스 + 캐리 플래그의 내용.

이진수를 더할 때의 운반은 열에 십진수를 더할 때의 운반과 유사합니다. 컴퓨터가 이진수를 더하고 그 합이 대상 피연산자에 맞지 않으면 캐리가 생성됩니다. 아시다시피 8비트 레지스터는 0부터 255까지의 범위에 있는 부호 없는 값을 보유할 수 있습니다. 예를 들어 숫자 250과 10의 이진 덧셈을 수행하면 다음과 같은 결과를 얻게 됩니다.

1111 1010; 숫자 250의 이진 표현입니다.

0000 1010 ; 숫자 10의 이진 표현.

1 0000 0100; 합계의 이진 표현은 260과 같습니다.

결과는 정확하지만 9개의 이진 비트를 차지합니다. 8비트 레지스터가 사용된 경우 하위 8비트는 대상 레지스터에 입력되고 9번째 비트는 캐리 플래그 CF에 입력됩니다.

이제 우리는 8086 마이크로프로세서에 두 가지 다른 추가 명령이 있는 이유를 이해합니다. 그 중 하나(ADD)는 고정밀 값의 하위 부분뿐만 아니라 바이트나 단어로 표현되는 값을 추가할 수 있습니다. 고정밀 값을 추가하기 위해 또 다른 명령어(ADC)가 사용됩니다.

추가할 피연산자는 메모리나 레지스터에 있거나 즉시 값을 가질 수 있습니다. 예를 들어:

AX,MEM_WORD 추가; 메모리 셀의 내용을 레지스터에 추가하고,

MEM_WORD,AX 추가; 또는 그 반대로, 레지스터의 내용을 메모리 셀에 추가합니다.

AL 추가, 10; 레지스터의 내용에 상수를 추가합니다.

MEM_BYTE,8H 추가; 상수와 메모리 셀의 내용을 추가합니다.

대부분의 가능한 조합이 허용되지만 그것은 금지되어 있다두 메모리 셀의 내용을 추가하거나 직접 값(숫자)을 수신기로 사용합니다.

ADD 및 ADC 명령은 다음 6개 플래그에 영향을 미칠 수 있습니다.

깃발을 들고 CF는 덧셈 결과가 대상 피연산자에 맞지 않으면 1이고, 그렇지 않으면 0입니다.

패리티 플래그 PF는 결과에 값이 1인 짝수 비트가 있으면 1이고, 그렇지 않으면 0입니다.

십진수를 더한 결과 수정이 필요한 경우 AF는 1과 같습니다.

제로 플래그결과가 0이면 ZF는 1이고;

서명 깃발결과가 음수(최상위 비트는 1)이면 SF는 1이고, 그렇지 않으면 0입니다.

오버플로 플래그 OF는 동일한 부호의 두 숫자의 합이 역방향 코드에서 수신자의 허용 값 범위를 초과하고 수신자 자체가 부호를 변경하는 경우 1과 같습니다. 그렇지 않으면 OF 플래그는 0입니다.

수신자 값을 1씩 증가시키는 명령 - INC

주식회사(증분)은 레지스터나 메모리 셀의 내용에 1을 추가하지만 ADD 명령과 달리 캐리 플래그 CF에는 영향을 주지 않습니다. 명령 형식: INC 수신기.

INC 명령은 명령 루프에서 카운터를 증가시키는 데 유용합니다. 또한 순차 메모리 셀에 액세스할 때 인덱스 레지스터의 값을 늘리는 데에도 사용할 수 있습니다. 피연산자는 부호 없는 숫자로 해석됩니다.

예를 들어:

INC CX; 16비트 값을 높이세요

포함; 또는 단위당 8비트 레지스터.

INC MEM_BYTE; 바이트 값 증가

INC MEM_WORD; 또는 단위당 메모리 단어.

즉치값을 피연산자로 사용할 수 없습니다.

빼기 명령 - SUB 및 SBB를 빌려서 빼기

보결(빼기 - 빼기) 및 SBB(차용으로 빼기)는 추가 명령 ADD 및 ADC와 각각 유사하며, 빼는 경우에만 캐리 플래그 CF가 대출의 신호로 작동합니다. 명령 형식: SUB 수신기, 소스;

SUB 명령은 대상 피연산자에서 소스 피연산자를 빼고 그 결과를 기호 표기법으로 대상에 배치합니다.

싱크:= 싱크 – 소스.

SBB동일한 작업을 수행하지만 수신자로부터 CF 캐리 플래그 값을 추가로 뺍니다.

SUB 수신기, 소스 – CF;

목적지:= 싱크 - 소스 - 캐리 플래그의 내용.

추가와 마찬가지로 SUB 및 SBB 명령어는 두 가지 별도의 기능을 수행합니다. 첫 번째 명령은 바이트 또는 워드 크기의 숫자와 고정밀 숫자의 하위 비트를 뺍니다(숫자의 하위 부분은 AX 레지스터에 있고 상위 부분은 AX 레지스터에 있음). DX 레지스터). 두 번째 명령은 고정밀 숫자의 최상위 비트를 뺍니다. 예를 들어, SUB AX,CX 명령; AX 레지스터의 내용에서 CX 레지스터의 내용을 빼고 그 결과를 AX 레지스터에 반환합니다.

피연산자 크기가 16비트를 초과하는 경우 다음 명령 시퀀스를 사용해야 합니다.

하위 AX,CX; 낮은 16비트를 뺍니다.

SBB BX, DX; 그 다음 가장 중요한 16비트입니다.

여기서는 AX 및 BX 레지스터에 있는 32비트 숫자에서 CX 및 DX 레지스터에 있는 32비트 숫자를 뺍니다. BX 레지스터의 내용에서 DX 레지스터의 내용을 뺄 때 SBB 명령은 첫 번째 빼기를 수행할 때 차용 가능성을 고려합니다.

하위 도끼, MEM; 레지스터에서 메모리 셀의 내용을 뺍니다.

서브멤버,AX; 메모리 셀에서 레지스터를 뺍니다.

하위 AL,1O; 레지스터에서 상수를 뺍니다.

서브 MEM_BYTE,OFh; 메모리 셀에서 상수를 뺍니다.

직접 뺄 수 없음한 메모리 셀의 내용을 다른 메모리 셀에서 가져오거나 즉각적인 값을 대상으로 사용합니다.

SUB 및 SBB 명령은 다음과 같이 6개의 플래그에 영향을 미칠 수 있습니다.

· 설치하다 깃발을 들고 CF는 대출이 필요한 경우 1이고, 그렇지 않은 경우 0입니다.

· 설치하다 패리티 플래그 PF는 뺄셈의 결과가 값 1인 짝수 비트를 가지면 1이고, 그렇지 않으면 0입니다.

· 설치하다 보조 캐리 플래그 AF는 소수 뺄셈의 결과에 수정이 필요한 경우 1이고, 그렇지 않은 경우 0입니다.

· 설치하다 제로 플래그결과가 0이면 ZF는 1이고, 그렇지 않으면 0입니다.

· 설치하다 서명 깃발결과가 음수(최상위 비트가 1)이면 SF는 1이고, 그렇지 않으면 플래그는 0입니다.

· 설치하다 오버플로 플래그 OF는 뺄셈 결과가 역방향 코드에서 수신자 값의 범위를 초과하고 수신자 자체가 부호를 변경하는 경우 1입니다.

SF 및 OF 플래그는 부호 있는 숫자를 뺄 때만 의미가 있고, AF 플래그는 10진수를 뺄 때만 의미가 있습니다.

대상 콘텐츠 감소 명령 - DEC

DEC 수신기(감소)는 레지스터의 내용이나 메모리 위치에서 1을 빼지만 (SUB 명령어와 달리) 캐리 플래그 CF에는 영향을 주지 않습니다.

DEC 명령어는 카운터 값이 0 또는 음수가 될 때까지 카운터 값을 감소시키기 위해 루프에서 자주 사용됩니다. 또한 순차 메모리 위치에 액세스할 때 인덱스 레지스터나 포인터의 값을 감소시키는 데에도 사용할 수 있습니다. 예를 들어:

12월 CX; 16비트 값 감소,

12월 알; 또는 8비트 레지스터.

12월 MEM_BYTE; 바이트 값을 줄입니다.

12월 MEM_WORD; 또는 워드 메모리 셀.

분할 지침 - DIV, IDIV

DIV(나누기 - 나누기)는 부호 없는 숫자 나누기를 수행하고 명령은 IDIV(정수 나누기 - 정수 나누기) 숫자의 부호 있는 나누기를 수행합니다. 이러한 명령의 형식은 다음과 같습니다.

DIV 소스; 어디 원천- 바이트 또는 단어 크기의 제수,

IDIV 소스;범용 레지스터나 메모리 위치에 위치합니다.

다음 사항에 유의하세요.

1. 배당금은 제수에 비해 두 배의 크기를 가져야 합니다.

2. 배당금은 항상 AX 레지스터(8비트 숫자로 나누는 경우) 또는 DX 및 AX 레지스터(16비트 숫자로 나누는 경우)에 있어야 합니다.

3. 명령 결과는 다음과 같이 반환됩니다.

· 소스 피연산자가 바이트이면 몫은 AL 레지스터로 반환되고 나머지는 AN 레지스터로 반환됩니다.

· 소스 피연산자가 워드이면 몫은 AX 레지스터로 반환되고 나머지는 DX 레지스터로 반환됩니다.

두 명령어 모두 플래그 상태를 정의되지 않은 상태로 두지만, 몫이 대상 레지스터(AL 또는 AX)에 맞지 않으면 마이크로프로세서는 유형 0 인터럽트(0으로 나누기)를 생성합니다.

4. 다음 조건에서 나누기 결과의 오버플로가 발생합니다.

· 제수는 0입니다.

· 부호 없이 바이트를 나눌 때 배당금은 제수의 256배 이상입니다.

· 부호가 없는 단어를 나누는 경우 배당은 제수의 65,536배 이상입니다.

· 부호를 사용하여 바이트를 나눌 때 몫은 -128에서 +127 범위를 벗어납니다.

· 기호로 단어를 나눌 때 몫은 의 범위 밖에 있습니다.

32768~32767.

다음은 나누기 작업의 몇 가지 일반적인 예입니다.

DIV BX; DX:AX를 부호 없는 BX로 나눕니다.

DIV MEM_BYTE; AX를 부호 없는 메모리 바이트로 나눕니다.

IDIV DL; AX를 DL로 기호로 나눕니다.

IDIV 메모리 워드; DX:AX를 부호 있는 메모리 워드로 나눕니다.

DIV 및 IDIV 명령어는 프로세서가 제수의 데이터 유형을 결정할 수 없기 때문에 즉치값으로 직접 나누지 않습니다.

곱셈 명령어 - MUL, IMUL

(곱하기) 부호 없는 숫자를 곱합니다. 이물(정수 곱하기) 부호 있는 정수를 곱합니다. 두 명령어의 피승수와 승수는 동일한 데이터 유형, 즉 바이트, 워드, 더블 워드 등이어야 합니다.

이러한 명령의 형식은 다음과 같습니다.

MUL 소스; 어디 원천- 범용 레지스터,

IMUL 소스; 또는 바이트 또는 워드 크기의 메모리 셀입니다.

첫 번째 피연산자(곱셈 가능)로서 MUL 및 IMUL 명령어는 AL 레지스터(바이트 연산용) 또는 AX 레지스터(워드 연산용)의 내용을 사용합니다. 해당 제품은 더블 사이즈로 되어 있으며 다음과 같이 반품됩니다.

· 곱셈 바이트- 16비트 제품을 레지스터 AN(상위 바이트) 및 AL(하위 바이트)로 반환합니다.

· 곱셈 단어-32비트 제품을 DX(상위 워드) 및 AX(하위 워드) 레지스터로 반환합니다. 따라서 제품의 크기는 N- 비트 인자가 동일함 2n.

캐리를 포함한 ADC 정수 덧셈

ADC첫 번째와 두 번째 피연산자의 추가를 수행하여 캐리 플래그 CF의 값을 결과에 추가합니다. 첫 번째 피연산자(대상)의 원래 값은 손실되고 추가 결과로 대체됩니다. 두 번째 피연산자는 변경되지 않습니다. 명령의 첫 번째 피연산자로 ADC

피연산자는 바이트 또는 단어일 수 있으며 부호 있는 숫자 또는 부호 없는 숫자를 나타냅니다. 팀 ADC(팀과 함께 추가하다)은 일반적으로 32비트 숫자를 추가하는 데 사용됩니다. 이 명령은 OF, SF, ZF, AF, PF 및 CF 플래그에 영향을 미칩니다.

실시예 1:

이동 AX,1125h ADC AX,2C25h; AX=3D4Bh, CF = 1인 경우;AX=3D4Ah, CF = 0인 경우

실시예 2:

; 데이터 필드에서: numlow dw 0FFFFh; 2학기 numhigh dw 000Sh의 낮은 부분; 2학기의 가장 높은 부분;번호 0005FFFFh=393215;프로그램 세그먼트에서: mov AX,000Sh; 1학기 하위부분 mov BX,0002h; 1항의 가장 높은 부분;번호 00020005h=131077 add AX,numlow; 주니어 부품 추가. AX=4, CF=1 adc BX, 높은 숫자; 캐리가 가능한 상위 파츠 추가. BX:AX=0008:0004h. ;번호 00080004h=524292

32비트 피연산자와 32비트 프로세서의 추가 주소 지정 모드를 사용할 수 있습니다. 팀 ADC 32비트 피연산자를 사용하면 64비트 정수를 더하는 데 사용할 수 있습니다.

:

; 데이터 필드에서 mem321 dd 0FFFFFFFFh; 첫 번째 항의 하위 부분 mem32h dd 98765432h; 1학기의 가장 높은 부분 프로그램 세그먼트에서 mov EAX,1; 2항의 하위부분 mov EBX,0; 2학기의 가장 높은 부분에 EAX,mem321;을 추가합니다. 아래쪽 절반을 추가합니다. Sum=100000000h>32비트; EAX=000000h, adc EBX,mem32h를 전달합니다. 오래된 반쪽을 접어서 가져 가세요. EBX=90000001h; 금액: 9876543300000000h

ADD 정수 더하기

추가하다첫 번째와 두 번째 피연산자의 추가를 수행합니다. 첫 번째 피연산자(대상)의 원래 값은 손실되고 추가 결과로 대체됩니다. 두 번째 피연산자는 변경되지 않습니다. 명령의 첫 번째 피연산자로 추가하다레지스터(세그먼트 1 제외) 또는 메모리 셀을 지정할 수 있으며, 두 번째 것은 레지스터(세그먼트 1 제외), 메모리 셀 또는 즉시값일 수 있지만 두 피연산자를 동시에 메모리로 정의하는 것은 허용되지 않습니다. 세포.

피연산자는 바이트 또는 단어일 수 있으며 부호 있는 숫자 또는 부호 없는 숫자를 나타냅니다. add 명령을 사용하여 일반 정수와 이진수를 모두 추가할 수 있습니다(AX 레지스터를 사용하여 결과 저장). 압축이 풀린 BCD(Binary Coded Decimal) 숫자가 추가되면 명령 뒤에 추가하다 aaa 명령을 사용해야 합니다. 묶음 숫자가 추가되면 명령은 다음과 같습니다. . 이 명령은 OF, SF, ZF, AF, PF 및 CF 플래그에 영향을 미칩니다.

실시예 1:

Mov BX,lFFEh mov CX,3 BX,CX를 추가합니다. BX=2001h, CX=0003h

실시예 2:

이동 AX,25h AX,12h를 추가합니다. AX=0037h

실시예 3:

; 데이터 필드에서: mem dw 128 ;프로그램 세그먼트에서: add mem,100; 메모리=228

캐리를 포함한 ADC 정수 덧셈

adc 명령은 첫 번째와 두 번째 피연산자를 추가하여 캐리 플래그 CF의 값을 결과에 추가합니다. 첫 번째 피연산자(대상)의 원래 값은 손실되고 추가 결과로 대체됩니다. 두 번째 피연산자는 변경되지 않습니다. adc 명령어의 첫 번째 피연산자는 레지스터(세그먼트 제외) 또는 메모리 셀일 수 있고, 두 번째 피연산자는 레지스터(세그먼트 제외), 메모리 셀 또는 즉시값일 수 있지만 지정할 수는 없습니다. 두 피연산자를 동시에 메모리 셀로 사용합니다. 피연산자는 바이트 또는 단어일 수 있으며 부호 있는 숫자 또는 부호 없는 숫자를 나타냅니다. adc 명령(add 명령과 함께)은 일반적으로 32비트 숫자를 추가하는 데 사용됩니다. 이 명령은 OF, SF, ZF, AF, PF 및 CF 플래그에 영향을 미칩니다.

실시예 1

Mov AX,1125h adc AX,2C25h ;AX=3D4Bh, CF = 1인 경우 ;AX=3D4Ah, CF = 0인 경우
실시예 2; 데이터 필드에서: numlow dw 0FFFFh ;두 번째 항의 하위 부분 numhigh dw 000Sh ;두 번째 항의 상위 부분;번호 0005FFFFh=393215 ;프로그램 세그먼트에서: mov AX,000Sh ;첫 번째 항의 하위 부분 mov BX, 0002h ; 첫 번째 항의 최상위 부분;번호 00020005h=131077 add AX,numlow;하위 부분 추가. AX=4, CF=1 adc BX, numhigh ;transfer.BX:AX=0008:0004h를 사용하여 상위 부품 추가. ;번호 00080004h=524292
32비트 피연산자와 32비트 프로세서의 추가 주소 지정 모드를 사용할 수 있습니다. 32비트 피연산자가 있는 adc 명령어를 사용하여 64비트 정수를 추가할 수 있습니다. 실시예 3; 데이터 필드에서 mem321 dd 0FFFFFFFFh ;첫 번째 항의 낮은 부분 mem32h dd 98765432h ;첫 번째 항의 높은 부분; 프로그램 세그먼트에서 mov EAX,1 ;두 번째 항의 하위 부분 mov EBX,0 ;두 번째 항의 상위 부분에 EAX,mem321을 추가합니다. 하위 절반을 추가합니다. Sum=100000000b>32비트;EAX=000000h, carry adc EBX,mem32h ;이전 절반을 추가하고 전송합니다. EBX=90000001h ;금액: 9876543300000000h
ADD 정수 더하기

add 명령은 첫 번째와 두 번째 피연산자를 추가합니다. 첫 번째 피연산자(대상)의 원래 값은 손실되고 추가 결과로 대체됩니다. 두 번째 피연산자는 변경되지 않습니다. add 명령의 첫 번째 피연산자는 레지스터(세그먼트 1 제외) 또는 메모리 셀로 지정될 수 있고, 두 번째 피연산자는 레지스터(세그먼트 1 제외), 메모리 셀 또는 즉시값이 될 수 있지만 두 피연산자를 동시에 메모리 셀로 정의하는 것은 허용되지 않습니다. 피연산자는 바이트 또는 단어일 수 있으며 부호 있는 숫자 또는 부호 없는 숫자를 나타냅니다. add 명령을 사용하여 일반 정수와 이진수를 모두 추가할 수 있습니다(AX 레지스터를 사용하여 결과 저장). 압축이 풀린 BCD(Binary Coded Decimal) 숫자를 추가하는 경우 add 명령 다음에 aaa 명령을 사용하십시오. 묶음 숫자가 추가되면 daa 명령을 실행하세요. 이 명령은 OF, SF, ZF, AF, PF 및 CF 플래그에 영향을 미칩니다. 실시예 1

Mov BX,lFFEh mov CX,3 add BX,CX ;BX=2001h, CX=0003h
실시예 2 mov AX,25h 추가 AX,12h ;AX=0037h
실시예 3; 데이터 필드에서: mem dw 128 ;프로그램 세그먼트에서: add mem,100 ;mem=228
실시예 4 mov AX,0507h ;BCD 압축 풀기 57 추가 AL,05h ;BCD 5, AX=050Ch aaa ;AX=0602h, BCD 62
실시예 5 mov AL,57h ;BCD 팩 57 추가 AL,05h ;BCD 5, AL=5Ch daa ;AL=62h, BCD 62

32비트 피연산자와 32비트 프로세서의 추가 주소 지정 모드를 사용할 수 있습니다.

Mov EAX,98765432h add EAX,11111111h ; EAX=A9876543h
AND 논리 AND

and 명령은 첫 번째 피연산자와 두 번째 피연산자의 논리적(비트별) 곱셈을 수행합니다. 첫 번째 피연산자(대상)의 원래 값은 손실되고 곱셈의 결과로 대체됩니다. 및 명령의 첫 번째 피연산자는 레지스터(세그먼트 1 제외) 또는 메모리 셀일 수 있고, 두 번째 피연산자는 레지스터(세그먼트 1 제외), 메모리 셀 또는 즉시값일 수 있지만 다음과 같은 것은 허용되지 않습니다. 두 피연산자를 동시에 메모리 셀로 지정합니다. 피연산자는 바이트 또는 단어일 수 있습니다. 이 명령은 SF, ZF 및 PF 플래그에 영향을 미칩니다. 비트별 곱셈 규칙:

첫 번째 피연산자 비트 0101 두 번째 피연산자 비트 0011 결과 비트 0001 실시예 1 mov AX,0FFEh 및 AX,5555h ;AX=0554h 실시예 2; 데이터 필드: mem dw 0С003h ;프로그램 세그먼트: mov AX,700Eh 및 AX,mem ;AX=4002h

32비트 피연산자와 32비트 프로세서의 추가 주소 지정 모드를 사용할 수 있습니다.

Mov EDX, 0FA8 8 0 0 4 lh 및 EDX,0FF00000Fh ; EDX = FA000001h
386P+ ARPL
요청된 선택기 권한 수준 조정

aprl 명령은 선택기를 허용된 최대 권한 수준(일반적으로 CS 선택기)을 포함하는 패턴과 비교하고 테스트할 값을 두 권한 수준 중 낮은 값으로 설정합니다. 레벨 변경이 필요하지 않은 경우 필요한 경우 ZF 플래그가 재설정됩니다. aprl 명령어의 첫 번째 피연산자는 16비트 레지스터이거나 확인 가능한 선택기가 있는 메모리 워드일 수 있습니다. 두 번째 피연산자는 패턴 선택기가 있는 16비트 레지스터입니다. 386+ 바운드
범위를 벗어난 배열에 대한 배열 인덱스 확인

bound 명령은 부호 있는 숫자로 처리되는 지정된 인덱스가 두 번째 피연산자가 지정한 범위 내에 있는지 확인합니다. 인덱스가 아래 또는 위의 배열 경계를 벗어나면 벡터 5의 인터럽트가 생성됩니다. 첫 번째 피연산자는 검사 중인 인덱스를 포함하는 레지스터여야 하며 두 번째 피연산자는 배열의 두 경계가 있는 메모리 필드의 주소입니다. 점검중입니다. 바운드 명령은 16비트와 32비트 피연산자를 모두 허용합니다(그러나 첫 번째와 두 번째 피연산자는 모두 동일한 유형이어야 합니다).

어셈블러- 인형용 어셈블리 언어

인형용 어셈블리 언어.(#2) (다) 미하일 스피친 1995플래그 프로세서의 레지스터 "F"를 플래그라고 합니다. 그것은 무엇입니까?플래그는 설정(1과 동일) 및 삭제(0과 동일)의 두 가지 상태를 가질 수 있는 변수입니다. 따라서 "F" 레지스터는 8개의 플래그 비트 집합으로 간주할 수 있습니다. 그 중 4개만 사용할 수 있습니다: 제로 플래그, 캐리 플래그, 부호 플래그, 패리티 오버플로 플래그. 산수는 매우 유용한 과학입니다. 우리는 더하기, 빼기, 나누기, 곱하기 등 끊임없이 무언가를 계산합니다. 이제 어셈블러에서 이를 수행하는 방법에 대해 설명하겠습니다. 예를 들어 "A"를 등록하기 위해 무언가에 1을 추가하는 가장 간단한 것부터 시작하겠습니다. *************************** *** ** LD A,NUBER INC A RET ******************************** 보시다시피, 이에 대한 매우 간단합니다. "INC" 명령이 있습니다. 즉, 증가(1씩 증가)와 피연산자가 뒤따릅니다. 일부 레지스터 또는 레지스터 쌍: ******************************** INC A INC HL INC H INC DE INC E INC IY INC E INC(HL) INC(IX+N) INC(IY+N) ****************************** ** 메모리 셀을 1씩 늘려야 한다면 다음과 같이 하십시오: ********************************* ****** *** LD HL,주소 LD IX,주소 INC(HL) INC(IX+0) RET RET ********************* **************** ***** 첫 번째 옵션은 하나의 메모리 셀로 작업하는 경우 더 빠르게 작동하고 더 편리하지만 테이블에서 작업하는 경우에는 그렇지 않습니다. 경제적이고 추악합니다. 비교: 테이블의 첫 번째, 다섯 번째, 10번째 바이트를 1씩 늘려야 합니다. ******************************* * LD HL,TABL+1 LD IX,TABL INC(HL) INC(IX+1) LD HL,TABL+5 INC(IX+5) INC(HL) INC(IX+10) LD HL,TABL+10 RET INC (HL) RET ******************************** 위에서 1 증가에 대해 언급한 모든 내용은 사실이며 감소를 위해, 즉 1씩 감소시키려면: ******************************** DEC A DEC HL DEC L DEC IX DEC H DEC DE DEC E DEC BC DEC D DEC IY DEC C DEC IX DEC B DEC (HL) DEC (IX+N) DEC (IX+N) ********************* *********** 이제 레지스터 "A"를 1이 아니라 10씩 늘려야 한다고 가정해 보겠습니다. **************** * *************** LD A,번호 추가 A,10 RET ************************* * ****** 레지스터 "A"에 숫자 및 기타 레지스터를 추가하고 레지스터 쌍 "HL", "IX" 및 "IY"로 주소가 지정된 메모리 셀을 추가할 수 있습니다. "HL", "IX" 및 "IY"를 사용하여 레지스터 쌍을 추가할 수도 있습니다. (PureBasic - 파일 시스템) ******************************** ADD A,N ADD A,(HL) ADD A ,A 추가 A,(IX+N) 추가 A,B 추가 A,(IY+N) 추가 A,C 추가 HL,HL 추가 A,D 추가 HL,BC 추가 A,E 추가 HL,DE 추가 A,H HL 추가,SP 추가 IX,IX 추가 IX,BC 추가 IX,DE 추가 IX,SP ****************************** ** 보시다시피 명령 세트가 상당히 많습니다. 이 명령을 실행하면 오류가 발생할 수 있습니다: ******************************** LD A,45 LD B,230 ADD A ,B RET ******************************** "A"와 "B"의 합이 255를 초과하고 따라서 "A" "에서는 275가 아니라 20이 됩니다(레지스터 "A"는 고무가 아닙니다). 오버플로가 발생했음을 알리기 위해 프로세서는 캐리 플래그를 1로 설정합니다. 남은 것은 그것을 확인하는 것뿐입니다. "INC"에 "DEC"가 있는 것처럼 "ADD"에도 "커플"이 있는 것처럼 이것이 "SUB"이며 고유한 특성이 있습니다. "SUB" 명령은 "A" 레지스터에서만 작동하므로 이 명령에 대한 니모닉을 작성할 때 "A"는 생략됩니다. ********************* *********** 서브 N 서브 C 서브 A 서브 H 서브 B 서브 D 서브 E 서브 (HL) 서브 (IX+N) 서브 (IY+N) ******** * ********************** 이 명령은 “ADD”와 같은 방식으로 캐리 플래그에 영향을 미칩니다. "ADD" 및 "SUB" 명령 쌍 외에도 또 다른 쌍이 있습니다. "ADC" 및 "SBC" 명령은 캐리 플래그를 고려하여 작동합니다. 더하거나 빼면 캐리 플래그의 값이 결과에 더해집니다. 캐리 플래그를 설정하는 두 가지 특수 명령인 "SCF"와 "CCF"가 있습니다. "SCF" - 캐리 플래그를 1로 설정합니다. "CCF" - 캐리 플래그를 0으로 설정합니다. ******************************** ADC A,N SBC A,N ADC A,A SBC A,A ADC A ,H SBC A,H ADC A,L SBC A,L ADC A,D SBC A,D ADC A,E SBC A,E ADC A,B SBC A,B ADC A,C SBC A,C ADC A,( HL) SBC A,(HL) ADC A,(IX+N) SBC A,(IX+N) ADC A,(IY+N) SBC A,)IY+N) ADC HL,HL SBC HL,HL ADC HL ,BC SBC HL,BC ADC HL,DE SBC HL,DE ADC HL,SP SBC HL,SP **************************** **** 이제 "ADC" 및 "SBC" 명령 작업의 예: ***************************** ** * LD A,10 LD A,10 LD B,5 LD B,5 CCF CCF SBC A,B ADC A,B RET RET A=5 B=5 A=15 B=5 ******* * *********************** "CCF" 및 "SBC A,B" 두 명령 대신 간단히 "SUB B"를 입력하면 결과가 나타납니다. 동일할 것입니다. ******************************** LD A,10 LD A,10 LD B,5 LD B,5 SCF SCF SBC A,B ADC A,B RET RET A=4 B=5 A=16 B=5 **************************** **** 결과에서 알 수 있듯이 캐리 플래그는 연산 결과에 큰 영향을 미칩니다. 빼면 결과에서 빼고, 더하면 결과에 더해진다. 이제 덧셈과 뺄셈에 관한 거의 모든 내용을 다루었습니다. 이제 나눗셈과 곱셈에 대해 이야기하겠습니다. 불행하게도 SPECCY에는 나누기 및 곱셈 명령이 없지만 이러한 명령은 다른 여러 명령으로 구성될 수 있습니다. 예를 들어, 두 레지스터 "A"와 "C"의 내용을 곱해야 합니다. ***************************** ********** *** LD A,10 LD C,5 LD B,A XOR A 루프 추가 A,C DJNZ LOOP RET *************** ********** ******* 이 예에는 "XOR A"와 "DJNZ LOOP"라는 두 가지 새로운 명령이 있습니다. "XOR A"는 레지스터 "A"를 지우고 "DJNZ LOOP" 명령은 레이블(예: "LOOP")로 표시된 명령부터 "DJNZ"(동일한 레이블이 뒤따름) 명령까지 모든 명령을 반복합니다. ka, 주기 시작 부분과 마찬가지로); 반복 횟수는 레지스터 "B"에 지정됩니다. M에 N을 곱하는 것은 숫자 M을 N번 더하는 것이라는 사실을 이용하면 위에 주어진 예를 이해할 수 있습니다. 이 속성은 나누기에도 사용될 수 있습니다. 직접 시도해 보세요. 다음번에는 비트를 비교하고 작업하는 명령에 대해 이야기하겠습니다.________________________________

산술 연산.





맨 위