asm
How to make & link
ml /Fl (filename.ext)
grdb (filename)
? : show help
q : quit grdb
g : go
t : run by step
u : dessemble / u n : n-> offset
r : view register value
meet int 21h, then go after call int 21h
g ,XX
d : dump memory
e : examine(enter) memory
a : assemble
2007/04/24
- program load 시
msdos load
psp (program segment prefix) (= context) 256byte
stack
data segment
code segment
- push
push ax ; (ss * 16 + sp) = ax
- grdb 시
- 23E6:0000 ... ; 23E6 -> code segment address
- convert case
- (char) & DFH => lower to upper
- (char) ^ 20H => upper to lower
- .586 지시어 사용 시
- 플랫 메모리 모델을 기본으로 사용
- 때문에 어드레스를 32bit로 변환
- 따라서 mov sp, (32bit addr) 식으로 변환되기 때문에 error 발생
- even
- 짝수 번지에서 메모리 r/w 시작
- movsw
-
(ds:si)->(ses:di)
cld (direction flag = 0) -> 증가시키기 위함
2007/05/01
- hex to ascii
- push, pop은 8비트 레지스터에 대해 적용 불가능, 16 or 32비트는 가능
- pop할 때 sp 위쪽 메모리 내용은 건드리지 않으나, 인터럽트가 들어오거나 하면서 사용하기 때문에 깨진다.
2007/05/03
3789 => ((((0*10+3)*10+7)*10 + 8)*10 + 9)
A * 10 = A * 2 + A * 8 = A << 1 + A << 3
홀수 magic number일 때
2 7 6
9 5 1
4 3 8
마지막 열 가운데 행에 1
우측 상단으로 돌아가면서 채운다
충돌이 발생하면 왼쪽으로 한칸 옮긴다
2007/05/15
F * b1 + (F * 2) * b2
2007/05/17
code
bss : 초기화 값을 갖지 않는 데이터
data
c compiler에서 -c 옵션으로 어셈블리 파일을 만들 수 있다
two pass 동작 : 소스를 두 번 읽는다.
(macro -> two pass 가능하나 기능의 제한이 발생하므로 single pass로 작성. 즉, forward reference가 불가능)
pass-1 -> symbol table 생성(레이블 값 결정)
pass-2 -> 머신 코드 생성
(pass-3 -> lst, link 정보 등 후처리를 작성할 수 있다)
macro
(macro name) macro [param, ...]
statements
endm
a macro
b: ;label
jmp b
endb
=> 두 번 이상 사용 시 b 레이블이 두 곳 이상 나타나 jmp 불가능 -> 에러
a macro
local b
b: ;label
jmp b
endb
=> a가 불릴 때마다 b를 다른 이름으로 확장하여 이름 중복을 방지
if high number -> 16비트 중 상위 8비트의 값이 무엇인가
code segment public -> 이 code 세그먼트를 다른 곳에서 불러 쓸 것이므로 공개하라
masm c,,,;
masm d,,,;
link c+d,e,,; => c와 d를 링크시키고, e라는 이름으로 실행 파일을 만들라
.listif -> if에 의해 어셈되지 않는 부분까지 리스트 파일에 출력
.lall -> macro 확장까지 리스트에 출력
calendar
365일 = 52주 + 1일
1년 1월 1일 월요일
2년 1월 1일 화요일
3년 1월 1일 수요일
4년 1월 1일 목요일 -> 윤년, 366
5년 1월 1일 "토"요일
(year - 1) + (year-1)/4 - (year-1)/100 + (year-1)/400 + 1 => 현재 year의 1월 1일 요일
2007/05/22
tower of hanoi
hanoi(n, src, aux, dst) {
if n == 0: return;
hanoi(n-1, src, dst, aux)
mov disk(n) from src to dest
hanoi(n-1, aux, src, dst)
}
ptr of pole -> top + 1
2 ^ 64 = 20digit cause db 10 dup(?)
mov sp, offset prend + 1024 : 마지막에 있는 prend 레이블로부터 1024 떨어진 위치에 stack 설정
frame pointer -> 일반적으로 bp를 사용
stack
dst
aux
src
n
ret
bp
maximum calldepth 저장
cmp al, call_depthm
jbe hanoig
mov call_depthm, al
cmp bp, offset prend + 128 : interrupt 등을 위한 시스템 스택 영역을 침범했는지 검사
add sp, 8 : procedure의 parameter가 8바이트이므로 콜이 끝난 후 삭제의 의미로 8개 이전으로 돌아감
conout [bx + 2] bx에 ptrb가 있고, 그 2바이트 뒤에 'b' 문자가 있다
magic square
mid = [n/2][n-1]
2007/05/29
- file device
- disk, memory, clock, ...
- os에 파일 정보 유지
- console
- error message
- generally, File handle >= 6
- char device
- kbd, prt, ...
- dos function
- Function 3Ch Create A File (CREAT)
Create a file with handle
entry AH 3Ch
CX byte, attributes for file
00h normal read/write
DS:DX address of ASCIIZ filename stringreturn CF 0 successful creation
1 error
AX 16 bit file handle
or error code (03h, 04h, 05h)
- Function 3Dh Open A File
- Function 3Eh Close A File Handle
- Function 3Fh Read From A File Or Device
- Function 40h Write To A File Or Device
- Function 3Ch Create A File (CREAT)
- rc4
- rc4 = stream generator : random generate
- c = k xor p
- p = k xor c
History
Last edited on 05/29/2007 11:24 by persona
Comments (0)