문제 : 분할을 할 DIV 사용하는 경우, 저장 레지스터의 범위에 걸쳐 너무 많은 사업의 결과가있을 수 있습니다,이 오류가 분할 오버 플로우라고합니다.
분할 오버 플로우를 해결하기위한 공식은 :
X : 배당, 범위 [0, FFFFFFFF]
N : 제수, 범위 [0, FFFF]
H : X-16 높은 범위 [0, FFFF]
L : X-낮음 16, 범위 [0, FFFF]
INT () : 서술 운영자, 제공자 가지고, 예를 들어, INT (10분의 38) = 3.
REM () 연산자의 설명 예를 들어, 나머지 복용 REM (10분의 38) = 8
화학식 : X / N = INT (H / N) * 65536 + [REM (H / N) * 65536 + L] / N
해결 방법 :
1, 인수 높은 데이터와 낮은 데이터 제수입니다
2. 결과 :
'내부 등의 하이 (H / N) * 65536
중의 낮은 [REM (H / N) * 65536 + L] 목록 / N,
나머지는 [REM (H / N) * 65536 + L] / N 나머지
3 공정 :
다음 DIV CX (1) 우선, 고역 통과 데이터 AX 들어오는 제수 CX,
AX INT의 값 (H / N)를 얻을 수있다 높은 결과
DX (2) 다음에, 값 65536을 곱하여 REM이다 (H / N)은,이 시간 있도록 16 비트, 32 비트 높은 데이터 사용량 DIV DX 16 비트 상당 고배당 낮은 배당 AX의 존재 유무 인 왼쪽에 상당 DX는 주문 데이터를 저장하고있다
(3) 마지막으로, 낮은 입력 데이터 AX는, DIV CX, 사업은 낮은 결과이며, 나머지는 나머지의 결과입니다.
쓰기 코드 :
주요 기능
;计算1000000/10=F4240H/0AH,结果为186A0H
mov ax,4240h;数据的低位
mov dx,0fh;数据的高位
mov cx,0ah;除数
call divdw;调用子函数
mov ax,4c00h
int 21h
에 대한 기능
divdw:
push si
push bx;保存现场
mov bx,ax
mov ax,dx;把数据的高位传入AX
mov dx,0
div cx;结果AX的数值为结果的高位,DX的数值为rem(H/N)
mov si,ax
mov ax,bx;把数据的低位传入AX
div cx;结果AX的数值为结果的低位,DX的数值为结果的余数
mov cx,dx
mov dx,si
pop bx;恢复现场
pop si
ret;函数返回
호출 명령
호출 명령 처리를 실행한다
(1) 또는 현재 IP CS와 IP 스택에
(2) 전송
호 레퍼런스
대응한다
IP 밀어
PTR 부호 근처를 JMP
지금까지 PTR 레이블을 호출하는 것은
동일하다
푸시 CS
푸시 IP
JMP FAR의 PTR 라벨
메모리 호출 워드의 PTR 주소
에 해당
는 IP 푸시
메모리 JMP의의 말씀 PTR 주소
예 :
mov sp,10h
mov ax,0123h
mov ds:[0],ax
call word ptr ds:[0]
;执行后,(IP)=0123h,(sp)=0EH
메모리의 DWORD PTR 주소를 호출
에 해당하는
연사가 밀어
는 IP 밀어
메모리의 JMP DWORD PTR 주소를
예를 들면 :
mov sp,10h
mov ax,0123h
mov ds:[0],ax
mov word ptr ds:[2],0
call dword ptr ds:[0]
;执行后,(CS)=0,(IP)=0123h,(sp)=0cH
RET와 retf
명령 데이터 스택, IP의 내용을 거의의 전송을 가능하게 마지막 ret
, CS와 IP의 내용을 수정, retf 명령 데이터 스택을 멀리 전송을 가능하게
통화 및 RET를 이용하여
프레임의 소스를 갖는 서브 다음과 같다 :
assume cs:code
code segment
main:
call sub1
:
:
mov ax,4c00h
int 21h
sub1:
:
:
call sub2
:
:
ret
sub2:
:
:
ret
code ends
end main