어 셈 블 리 기본 프레임 워 크
질문
FEES DW 100 DUP(?)FEES DW 100 DUP(0) DUP() ?DUP 100 100 ?
100 100
? 。
질문 ASSUME
예전 에 어 셈 블 리 를 배 울 때 assume 가 무엇 에 쓰 였 는 지 잘 모 르 겠 어 요. 오늘 포럼 에서 찾 아 보 니 한 네티즌 이 이렇게 설명 하 는 것 을 발 견 했 습 니 다.
"데이터 세그먼트 에서 정의 하 는 모든 변수 플래그 는 하나의 오프셋 (유효한 주소 라 고도 함) 을 의미 합 니 다. 이 오프셋 은 데이터 세그먼트 값 과 결합 하면 메모리 주 소 를 가리 킵 니 다. 프로그램 에서 ASSUME 위조 명령 을 사용 하 는 것 은 기본 세그먼트 주 소 를 가리 키 는 것 입 니 다. 특정한 데이터 세그먼트 의 세그먼트 이름 을 특정한 세그먼트 레지스터 에 지정 하면 (예 를 들 어 ASSUME) DS, DATA 1), 그 이후 이 데이터 세그먼트 (DATA 1) 에 정 의 된 변 수 를 사용 하면 컴 파 일 러 는 자동 으로 이 세그먼트 레지스터 (DS) 의 세그먼트 값 (세그먼트 주 소 를 표시 함) 과 결합 해서 사용 합 니 다. "
ASSUME CS: CODE, DS: DATA: ASSUME 위조 명령 은 각 논리 세그먼트 가 불 러 와 야 할 주 소 를 가리 키 지만 세그먼트 기본 주 소 를 해당 세그먼트 레지스터 에 불 러 오지 않 았 습 니 다. ASSUME 는 각 세그먼트 레지스터 와 현재 사용 되 고 있 는 논리 세그먼트 의 대응 관 계 를 지적 합 니 다. CS 는 시스템 이 프로그램 을 불 러 온 후 시스템 에서 자동 으로 불 러 옵 니 다. 즉, 운영 체제 의 작업 (프로 세 스) 입 니 다.관리자 가 자동 으로 장 착 을 완 료 했 습 니 다. 이 장 착 은 사용자 가 관리 할 필요 가 없습니다. 스 택 SS 도 사용자 가 장 착 하지 않 아 도 되 고 시스템 에서 자동 으로 장 착 할 수 있 습 니 다. 이 때 는 스 택 세그먼트 의사 명령 을 정의 하 는 과정 에서 매개 변 수 를 모두 써 야 합 니 다.
1 층 의 말 이 맞습니다. 글 에서 아 이 디 어 를 말 하지 않 았 습 니 다. 쉽게 말 하면 매번 입력 세그먼트 가 접 두 사 를 뛰 어 넘 는 번 거 로 움 을 줄 이기 위해 서 입 니 다. 예 를 들 어 MOV AX, A 는 기본적으로 DS 를 사용 합 니 다. 그러나 A 가 있 는 데이터 세그먼트 가 ASSOME 으로 ES 를 지정 하면 여 기 는 ES 를 사용 합 니 다. 기본 DS 를 사용 하지 않 으 면 MOV AX, ES: A 를 사용 해 야 ES 를 사용 할 수 있 습 니 다. 글 에서 들 은 예 도 좋 지 않 습 니 다.하나의 답장, 명령 에서 변 수 를 사용 하 는 것 은 바로 주소 찾기 방식 입 니 다. 기본 값 은 DS 를 사용 하 는 것 입 니 다. 변수 에 대응 하 는 세그먼트 레지스터 를 ASSUME 로 지정 할 필요 가 없습니다. ES 의 예 를 들 어야 합 니 다. 프로그램 이 하나의 프로그램 세그먼트 와 하나의 데이터 세그먼트 만 있 으 면 ASSUME 가 필요 하지 않 습 니까? 기본 값 은 CS 와 DS 를 사용 하 는 것 이기 때 문 입 니 다.
ASSUME DS, DATA 1 은 옳지 않 습 니 다. 건물 주 는 ASSUME DS: DATA 1 (일반적으로 data 1 과 같은 식별 자 를 사용 하지 않 습 니 다. data 1 은 논리 적 인 단락 이 아 닌 변수 이름 을 표시 합 니 다) 7 층 정 해 를 해 야 합 니 다. [ASSUME 는 각 단락 의 레지스터 와 현재 사용 되 고 있 는 논리 세그먼트 의 대응 관 계 를 지적 합 니 다].........................................................................................................
자신 이 쓴 책의 첫 번 째 비교적 완전한 예:
잘못 쓴 부분: [1] count EQU 7: count DB 7 【 2 】 잊 어 버 리 고 쓰기: mov ah, 4ch INT 21h 그리고 두 번 째 로 4ch 를 al 에 게 대 입 했 습 니 다. 【 3 】 스 택 세그먼트 를 쓸 때 공간 을 직접 정의 할 수 있 습 니 다. DB 100 h DUP (?) 는 변수 명 [4] LOOP loop 1 의 용법 을 추가 할 필요 가 없습니다. 먼저 loop 1 을 사용 하고 LOOP loop 1 [5] 9 개의 수 를 더 하 는 방법 을 사용 합 니 다. 저 는 'al 을 비우 고 [SI]' 라 고 썼 습 니 다.AL 로 이동 한 후 INC SI, ADD al, [SI] 사실: AL 을 직접 비우 고 ADD, INC SI 를 사용 하면 됩 니 다. CX 는 순환 횟수 를 제어 할 수 있 습 니 다. 이전 방법의 순환 횟수 는 한 번 적 고 cx 값 도 주의해 야 합 니 다.
; add 9 bytes NAME add9bytes qiaoDATA SEGMENT data1 DB 5 dup(1), 11h, 11h count EQU 7 SUM DB ? qiaoDATA ENDS qiaoSTACK SEGMENT STACK DB 100h DUP(?) qiaoSTACK ENDS qiaoCODE SEGMENT ASSOME DS: qiaoDATA; SS: qiaoSTACK; CS: qiaoCODE START: mov ax, qiaoDATA mov ds, ax; 이 두 마디 는 qiaoDATA 를 DS 세그먼트 에 넣 는 것 입 니 다. 그러나 ASSOME 은 이미 이런 의 미 를 가지 고 있 습 니 다. 여기, 이 두 마디 도 ok 이 필요 없습니다. xor al, al LEA SI, data 1 mov cx, count Loop 1: ADD al, [SI] INC SI LOOP loop loop 1 mov sum, al MOV ah, 4ch INT 21h qiaoCODE ENDS end start
기타
【 6 】 loop 1 은 레이 블 로 NEAE 와 FAR 두 가 지 를 사용 할 수 있 지만 여기 에는 사용 되 지 않 습 니 다. 【 7 】 변 수 는 세 가지 속성 이 있 습 니 다. 세그먼트 속성, 오프셋 속성, 유형 속성, [8] 상수 가 a3h 로 시작 할 때 식별 자로 헷 갈 리 지 않도록 0 으로 시작 해 야 합 니 다. 【 9 】 바이트: BYTE 글자: WORD 두 글자: DWORD 네 글자: QWORD 10 바이트: TBYTE
e1.asm
NAME add9bytes qiaoDATA SEGMENT D1 DB 41h, 6dh D2 DW 803ah, 104fh D3 DD 12345678h, 0ABCDEF9H D4 DW 40 DUP(1) qiaoDATA ENDS qiaoSTACK SEGMENT STACK DB 100h DUP(?) qiaoSTACK ENDS qiaoCODE SEGMENT ASSUME DS:qiaoDATA; SS:qiaoSTACK; CS:qiaoCODE START: mov ax, qiaoDATA mov ds, ax ; real start mov ax, SEG D1 mov bx, SEG D2 mov cx, SEG D3 mov ax, OFFSET D1 MOV BX, OFFSET D2 MOV CX, OFFSET D3 MOV DX, OFFSET D4 mov ax, TYPE D1 MOV BX, TYPE D2 MOV CX, TYPE D3 MOV DX, TYPE D4 mov ax, LENGTH D1 MOV BX, LENGTH D2 MOV CX, LENGTH D3 MOV DX, LENGTH D4 mov ax, SIZE D1 MOV BX, SIZE D2 MOV CX, SIZE D3 MOV DX, SIZE D4 MOV ah,4ch INT 21h qiaoCODE ENDS end start
SEG
주소 연산 자
mov ax, SEG D1 mov bx, SEG D2 mov cx, SEG D3, D1, D2 가 DS 데이터 세그먼트 에서 정의 되면 SEG 후 얻 은 값 이 일치 합 니 다.
OFFSET
오프셋 주소 연산 자
mov ax, OFFSET D1 ;0000 MOV BX, OFFSET D2 ;2 MOV CX, OFFSET D3 ;6 MOV DX, OFFSET D4 ; E=15
TYPE
형식 연산 자가 Byte 라면 = 1 변수 유형: word = 2 dword = 4 qword = 8 tbyte = 10 레이 블 유형: NEAR - 1 FAR - 2
mov ax, TYPE D1 MOV BX, TYPE D2 MOV CX, TYPE D3 MOV DX, TYPE D4
LENGTH
변수 단위 수 (변수 에 포 함 된 단위 개수) 이 연산 결 과 는 다음 과 같 습 니 다. 이 변 수 는 의사 명령 의 첫 번 째 표현 식 형식 을 정의 합 니 다. n UDP () 라면 n 이 고 그렇지 않 으 면 1 입 니 다.
mov ax, LENGTH D1 MOV BX, LENGTH D2 MOV CX, LENGTH D3 MOV DX, LENGTH D4 P. S.: D4 DW 40 DUP (1), 45h, 00h 에 세 가지 정의 가 있 더 라 도 첫 번 째 40 에 따라 대답 할 뿐 입 니 다. 40 = 28H
SIZE
변수 총 바이트 수 (이 연산 법 에 포 함 된 총 바이트 수, 책 에 소 개 된 유사 성: qiaobar DB 10 DUP (1), 11h, 22h 는 12 일 것 입 니 다. 그러나 사실은 제 가 테스트 한 것 은 첫 번 째 변수의 바이트 수, 즉 10 입 니 다.
mov ax, SIZE D1 MOV BX, SIZE D2 MOV CX, SIZE D3 MOV DX, SIZE D4
HIGH
mov al,HIGH 1234h mov al,LOw 1234h
;12 ;34
SHORT
그 다음 레이 블 이 단거리 (- 128 ~ 127 사이) 라 는 뜻 이다.
()
우선 순위 변경
[]
간접 주소 지정
관계 연산 자
EQ 대등한 NE 같 지 않 은 LT 는 GT 보다 작 아서 LE < = GE > =
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
byte와 길이가 8인 boolean 수조가 서로 변환되는 것을 간단히 말하다바이트는 8바이트이기 때문에. 그래서 그것으로 수조가 8인 boolean 수조를 저장할 수 있는데, 이것은 통신 프로토콜에서 자주 사용된다.여기에 자바 코드가 서로 변환되는 것을 보여 줍니다. 이상의 이 평론byte...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.