2015-04-07 32 views
0

在下面的代碼中,我用星號評論了我遇到的問題。正如你所看到的,SI包含(160 * 8)。這是正確的值,但是,我需要改變它,而不是(160 * 8),它應該是(160 *高度)。高度在數據段中作爲數據庫聲明。我明白我不能說(160 *高),但有人可以幫我解決這個問題嗎?我只需要在SI中存儲正確的值。謝謝DOSBox中的問題:[MOV SI,(160 * height)]?

MyData SEGMENT 

    singleLine DB 0DAh, 0CFh, 0C0h, 0D9h, 0C4h, 0B3h 
    doubleLine DB 0CAh, 0BBh, 0C8h, 0BCh, 0CDh, 0BAh 

    ulCorner EQU 0 
    urCorner EQU 1 
    blCorner EQU 2 
    brCorner EQU 3 
    horLine EQU 4 
    verLine EQU 5 

    singleOrDouble DB 1 
    foreground DB 0001 
    background DB 0011 
    height DB 8 
    startCorner DW 1512 

MyData ENDS      

;------------------------------------------------------------------------ CODE SEGMENT 
MyCode SEGMENT 
     ASSUME CS:MyCode, DS:MyData 

MainProg PROC     

    MOV  AX, MyData    
    MOV  DS, AX     
    MOV  AX, 0B800h   
    MOV  ES, AX 

    CALL drawBox 

    MOV  AH, 4Ch     
    INT  21h     

MainProg ENDP 

drawBox PROC 
    MOV AH, foreground 
    MOV AL, singleLine + ulCorner 
    MOV BX, startCorner 
    MOV ES:[BX], AX 
    MOV AL, singleLine + blCorner 
    MOV SI, 160 * 8 ;*****************height = 8******************** 
    MOV ES:[BX + SI], AX 
    RET 
drawBox ENDP 

MyCode ENDS  

回答

1

您可以從內存中的值加載到像ax寄存器,以mov,你可以乘一個寄存器與mulimul一個恆定值。

您也可以在mov之間傳輸寄存器,或者在兩個特定寄存器之間不可用的情況下,如push ax; pop si

因此,儘管它已經多年,因爲我已經做了x86彙編,這將是在那裏我開始:

push ax    ; Save registers we're using. 
push bx 

xor ax, ax   ; Get height value. 
mov al, [height] 

mov bx, 160  ; Multiply by 160. 
mul bx 

push ax    ; Copy to SI. 
pop si 

pop bx    ; Restore registers. 
pop ax 

你可以抽成同樣的東西nasm,而是由三個倍增,而不是一百六十(因爲退出代碼是有限的):

section .text 
    global _start 
_start: 
    push ax    ; Save registers. 
    push bx 

    xor ax, ax   ; Get height value (8). 
    mov al, [height] 

    mov bx, 3   ; Triple. 
    mul bx 

    push ax    ; Move to SI. 
    pop si 

    pop bx    ; Restore registers. 
    pop ax 

    xor ebx, ebx  ; Return result as exit code 
    push si 
    pop bx 
    mov eax, 1 
    int 0x80 

section .data 
height db 8 

彙編,連接和運行的代碼,然後檢查出口值給你正確的結果,8 * 3 = 24

pax$ nasm -f elf demo.asm 
pax$ ld -m elf_i386 -s -o demo demo.o 
pax$ ./demo ; echo $? 
24 
+0

感謝您的反饋,我知道MOV和MUL等等,我一直在玩他們的過去一小時,我只是不能得到它的工作,我已經在使用AX把角色放在屏幕上,我已經在使用BX來保存起始位置,如果你知道我能做什麼,你能告訴我嗎?謝謝。 – BCRwar1

+0

@ BCRwar1,我添加了一些代碼讓你走。 – paxdiablo

+0

謝謝你這個漂亮的工作! – BCRwar1