DOSBox中的麻烦:[MOV SI,(160 *身高)]?

时间:2015-04-07 03:12:05

标签: assembly dosbox

在下面的代码中,我用星号评论了我遇到问题的那一行。如您所见,SI包含(160 * 8)。这是正确的值,但是,我需要更改它,而不是它(160 * 8),它应该是(160 *高度)。高度在数据段中声明为DB。我明白我不能说(160 *身高)但有人可以帮我解决这个问题吗?我只需要在SI中存储正确的值。谢谢

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 个答案:

答案 0 :(得分: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