어셈블리의 곱셈과 나눗셈
글쓴이: mydream / 작성시간: 월, 2017/02/06 - 5:13오후
스레드에 대해 공부하다가 자원의 경합(Data Racing) 문제에 부딪히게 됐습니다. 스레드 A와 스레드 B가 전역의 공유 자원에 동시에 접근하는 경우 스레드가 연산의 결과를 메모리에 다시 돌려주기 전에 스레드 B가 읽어서 연산을 하면 전역의 공유자원은 덮어 쓰이기 때문에 결국 스레드 A의 연산결과는 무시가 되는 문제가 생기더군요. 이런 문제를 막으려면 원자성이 확보되어야 한다고 합니다. 기계는 하나의 연산을 여러 단계로 나누어서 처리를 하는 경우가 있다고 하더군요. 이 작업이 더 이상 쪼개질 수 없는 단위로 간주해 버리면 원자성이 확보된다는 것인데. 그래서 기계어와 가까운 어셈블리를 배워보려고 관련 서적을 봤습니다. 그런데 덧셈과 뺄셈과 같은 이항 연산은 ADD, SUB와 같은 명령어로 제공이 되는데, 곱셈과 나눗셈은 없는 것으로 보입니다. MUL이라는 명령어는 제곱을 해주는 일항연산이고, 그로 봐서 DIV 명령어는 제곱근을 구하는 명령어로 추측이 되는데요. 이항 연산 관련 연산자로써 곱셈과 나눗셈을 제공하는 명령어는 없는지 궁금합니다. 어떤 명령어로 하면 될까요?
Forums:
MUL 과 DIV 가 이항 연산의 곱셈과 나눗셈이
MUL 과 DIV 가 이항 연산의 곱셈과 나눗셈이 맞습니다.
다만, 항 중 하나가 특정 레지스터에 입력되어야 합니다.
사용할려는 대상 기계마다 다 틀려요.
사용할려는 대상 기계마다 다 틀려요.
x86 기준으로 곱셈, 나눗셈은 MUL,DIV 담당이고요. 인수는 1개만 넣습니다. 지정하지 않은 인수 하나는 AX레지스터 고정이고 여기에 미리 값을 넣어야 합니다.
Written By the Black Knight of Destruction
레지스터의 용도가 있군요.
나눗셈할 때에는 EAX에서 제수를 미리 읽어야 하는군요. 그리고 몫은 EAX, 나머지는 EDX로 설정이 되고요. 감사합니다.
댓글 달기