어셈블리에서 어떻게하면 좋을까요? 편집 :어셈블리 픽셀의 2 차원 배열
그래서 내 루프 꽤 작업 DOS 그래픽 모드를
int start_x=1, start_y=1;
for(int i=0; i<8; i++){
for(int j=0; j<8; j++){
if(T34[i][j]==1) put_colour_pixel(start_x+i, start_y+j);
else put_black_pixel(start_x+i, start_y+j);
}
}
을 16 비트. 0 테이블에 연결과 1
mov ax, 10 ; Y start line
mov bx, 20 ; X start line
mov dl, 4 ; colour (red)
mov cx, 5 ; loop top counter
top:
add ax, 1
push cx ;loop top counter
mov cx, 10
inside:
add bx, 1
push ax
push bx
push cx
call putpixel
pop cx
pop bx
pop ax
loop inside
mov bx, 20 ;next line X go to start X
pop cx ;loop top counter
loop top
하는 방법 //////////////////////////////// /////////////////////////////////////////////////////////////////// /////// ///////////////////////////////////////////////////////////////////////////// /////////////////////////////// // /////////////////////////////////////////////////////////////////// ///////////////////////////////////// 내 새로운 코드 :
segment .data
segment .code
..start:
mov ax, 13h
int 10h ; switch to 320x200 mode
mov ax, 0a000h ; The offset to video memory
mov es, ax ; We load it to ES through AX,
; because immediate operation
; is not allowed on ES
;;;;;;;;;;;;;;;;;;;;;;
mov di, T34
mov si, 8
;------------------------------------
P1: mov bp, 8
;----------------
P2: cmp BYTE[di], 1
jnz short NOHIT
NOHIT: ; increase the x position
push ax
push bx
push cx
mov ax,si ;Y
mov bx,bp ;X
mov dl, 1 ; here I should take '0' or '1' from table
call putpixel
pop cx
pop bx
pop ax
inc di ; increase offset address of array
dec bp
jnz P2
;-------------
; increase the y position + substract 8 from x position
dec si
jnz P1
;------------------------------------
;;;;;;;;;;;;;;;;;;;;;;;;;
xor ah, ah
int 16h ; keyboard (wait for key)
mov ax, 3
int 10h ; go to text mode
mov ax, 4c00h
int 21h ; return to DOS, exit code 0
;;;;;;;;;;;;;;;;;;;;;
putpixel:
push dx ; mul changes dx too
mov cx, 320
mul cx ; multiply Y (ax) by 320 (one row)
add ax, bx ; and add X (bx) (result= dx:ax)
mov di, ax
pop dx
mov [es:di], dl ; store color/pixel
ret
;;;;;;;;;;;;;;;;;;;;;;
T34 DB 1,1,1,1,1,1,1,1
DB 1,0,0,0,0,0,0,0
DB 1,0,0,0,0,0,0,0
DB 1,0,0,0,0,0,0,0
DB 1,1,1,1,1,1,1,1
DB 1,0,0,0,0,0,0,0
DB 1,0,0,0,0,0,0,0
DB 1,1,1,1,1,1,1,1
I 순서가 바뀌었고 지금은 왼쪽 구석에 정사각형을 그리고 있습니다 (예상대로). 주문을 변경 했습니까? 나는 그 편지가 회전 될 것이라고 생각하지만 그것은 나에게는 문제가되지 않는다. 나는 나중에 고칠 수있다.
이제 테이블과 색상에서 '0'또는 '1'로 이동해야합니다. 어떤 레지스터가 "0"또는 "1"입니까?
그래서 대부분 색에 문제가 있습니다. 이 방법을 사용해 보았지만 오류가 있습니다. I (0) 또는 파란색 (1)
그래서push dx
mov ax, bp ; X*8
mov cx,8
mul cx
add ax, si ; X*8 +Y
add ax, di ; tab0 + X*8+Y
mov dl, ax; here is error, here I set the colour
pop dx
나는 그것을 해결하는 방법 :(나는 다른 가능성과 북향 작업을 시도하도록 모르는 세트 색상 블랙을 시도합니다.
"나는 저장해야 ... 변수 ...."사용 레지스터. 작업 속도가 빠르고 주소 지정이 쉽습니다. –
나는 시도 할 것이지만, 처음 시작 x, 시작 y, 루프 카운트를 저장하기에 충분한 등록자인지는 확실하지 않다. (좋은 방법인가 또 다른 것인가?), 픽셀 x, 픽셀 y. 배열은 어떨까요? 어떻게 접근 할 수 있습니까? 아니면 32 비트를 사용해야합니까? 그 많은 질문에 대해 미안하지만, 나는 방금 시작했다 – kkkkk
등록 사용과 경제. 빈번하게 액세스되지 않는 레지스터를 쌓아서 대체 사용을 위해 해제하십시오. –