在下面的代码中,我用星号评论了我遇到问题的那一行。如您所见,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
答案 0 :(得分:1)
您可以使用ax
将内存中的值加载到mov
之类的寄存器中,并且可以将具有常量值的寄存器与mul
或imul
相乘。
您也可以使用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