저는 어셈블리를 배우기 시작했고 OS 클래스의 일부로 간단한 부트 로더를 만들고 있습니다. 코드를 좀 더 효율적으로 만들려고합니다. 즉, 지금까지 내가 한 일이 내가 원하는 것을 성취 할 수있는 좋은 방법이라고 생각하지 않습니다. 즉, 나는 이것을 수행하는 가장 효율적인 방법이라고 생각하는 점프/브랜치/룩업 테이블을 문서화하는 온라인 자원을 찾기 위해 고심하고있다.cmp/je를 많이 사용하는 대신 어셈블리 점프/분기/찾아보기 테이블?
내가 달성하고자하는 것을 설명하기 위해 0에서 4까지 dx
레지스터의 값을 반환하는 함수를 호출하고 있습니다. 현재는 cmp
명령어를 사용하여 값을 비교하고 값이 같으면 조건부 je
을 점프하십시오. 만약 내가 더 높은 수준의 언어로 이것을 작성했다면, 나는 더 효율적인 switch
문장을 사용하는 대신 본질적으로 복수의 if
문장을 차례대로 수행 할 것이다.
그래서 여기 내가 지금 뭘하는지입니다 :이있다
cmp dx, 1
je .F_1
cmp dx, 2
je .F_2
cmp dx, 3
je .F_3
cmp dx, 4
je .F_4
cmp dx, 0
je .F_5
jmp RangeError_Handler
.F1:
mov si, msg1
jmp F_Exit
.F2:
mov si, msg2
jmp F_Exit
... ; .F3 and .F4 follow the pattern
.F5: ; special case
mov si, msg_error
call PrintLn
hlt
F_Exit:
call PrintLn
... ; and do something else
msg1: db 'Message 1', 0
msg2: ...
...
이 작업을 수행 할 수있는 더 좋은 방법이 될 수 있습니다. 나의지도 교사는 점프 테이블이 이상적이라고 암시했지만 나에게 그것이 어셈블리에서 어떻게 작동할지에 대한 어떤 종류의 추가 설명을 줄 시간이 없었습니다. 그래서 누군가가 일종의 예제를 제공 할 수 있다면 매우 감사 할 것입니다. 내 상황.
이론적으로 dx의 값을 확인한 다음 5 개의 개별 시간을 확인하는 대신 특정 함수로 이동하는 함수가 하나 있는데 어셈블리에서이를 구현하는 방법을 알 수 없습니다. 문자열에 조회 테이블을 사용하는 것이 더 효율적입니까? 즉, 1의 반환 값은 테이블의 문자열 1을 나타 냅니까?
수정 사항으로 인해 질문과 대답 모두에 버그가 생기고 논리가 매우 단순 해지면서 특별한 경우를 가진 다른 사람들이이 질문과 답변이 해당 사례에 적용되지 않는다고 생각할 수 있습니다. 나는 그것을 다시 정상적인 질문으로 되돌려 놓았다고 생각한다. 나는 당신의 코드가 무엇을하는지보기가 힘들지 않았기 때문에 그것을 되 돌리는 것을 고려했다. (그리고 A20의 내용을 확인했다는 사실은 MichaelPetch가 CS가 설정되었는지 확인하는 데 유용한 관찰을하도록 만들었습니다.) 코드는 따라하기 쉽다면 완전히 일반적인 것일 필요는 없습니다. –