我是新來的程序集,我一直在嘗試創建一個程序,每個數字最多需要3位數字([numR],[numG],[numB]),然後執行公式:(65536 * [numR] + 256 * [numG] + [numB]),最後打印出結果。如何在裝配體中乘兩個大數字打印出結果?
我已經編寫了大部分程序(我已經能夠從用戶獲得每個數字的輸入並將其存儲在上面顯示的3個變量中),但我似乎無法找到一種方法執行公式,主要是因爲在乘以大數字時,結果會在寄存器dx和ax之間分開。
我不知道怎麼會這樣的幫助,但這裏是到目前爲止我的代碼:
;------------------------------------------
; PURPOSE : Color Code Generator
; SYSTEM : Turbo Assembler Ideal Mode
; AUTHOR : Re'em Kishnevsky
;------------------------------------------
IDEAL
MODEL small
STACK 256
DATASEG
include 'start.txt'
count db 0
num db ?, ?, ?
numR dw ?
numG dw ?
numB dw ?
numFinal dd ?
CODESEG
Start:
mov ax, @data
mov ds, ax
;Sets text mode
mov ah, 0
mov al, 2 ; 3
int 10h
;Sets cursor position 0,0
mov dh, 0
mov dl, 0
call SetCursorPosition
;Prints initial message
mov dx, offset msg
mov ah, 09h
int 21h
call ReadKeyInput
;Sets cursor position 0,0
mov dh, 0
mov dl, 0
call SetCursorPosition
;Paints the screen red
mov bl, 01000000b
call PaintScreen
;Prints RED message
mov bp, offset red
mov bl, 01001111b
mov cx, 31
mov dh, 10
mov dl, 24
call PrintMessage
;Sets cursor position 35,12
mov dh, 12
mov dl, 35
call SetCursorPosition
mov bl, 01001111b
call DetermineNumber
cmp [count], 1
je R1Digit
cmp [count], 2
je R2Digit
dec si
push [si]
pop [numR]
dec si
mov al, 10
mul [byte ptr si]
add [numR], ax
dec si
mov al, 100
mul [byte ptr si]
add [numR], ax
jmp Phase_green
R1Digit:
dec si
push [si]
pop [numR]
jmp Phase_green
R2Digit:
dec si
push [si]
pop [numR]
dec si
mov al, 10
mul [byte ptr si]
add [numR], ax
Phase_green:
;Sets cursor position 0,0
mov dh, 0
mov dl, 0
call SetCursorPosition
;Paints the screen green
mov bl, 00100000b
call PaintScreen
;Prints GREEN message
mov bp, offset green
mov bl, 00101111b
mov cx, 33
mov dh, 10
mov dl, 24
call PrintMessage
;Sets cursor position 35,12
mov dh, 12
mov dl, 35
call SetCursorPosition
mov [count], 0
mov bl, 00101111b
call DetermineNumber
cmp [count], 1
je G1Digit
cmp [count], 2
je G2Digit
dec si
push [si]
pop [numG]
dec si
mov al, 10
mul [byte ptr si]
add [numG], ax
dec si
mov al, 100
mul [byte ptr si]
add [numG], ax
jmp Phase_blue
G1Digit:
dec si
push [si]
pop [numG]
jmp Phase_blue
G2Digit:
dec si
push [si]
pop [numG]
dec si
mov al, 10
mul [byte ptr si]
add [numG], ax
Phase_blue:
;Sets cursor position 0,0
mov dh, 0
mov dl, 0
call SetCursorPosition
;Paints the screen blue
mov bl, 00010000b
call PaintScreen
;Prints GREEN message
mov bp, offset blue
mov bl, 00011111b
mov cx, 32
mov dh, 10
mov dl, 24
call PrintMessage
;Sets cursor position 35,12
mov dh, 12
mov dl, 35
call SetCursorPosition
mov [count], 0
mov bl, 00011111b
call DetermineNumber
cmp [count], 1
je B1Digit
cmp [count], 2
je B2Digit
dec si
push [si]
pop [numB]
dec si
mov al, 10
mul [byte ptr si]
add [numB], ax
dec si
mov al, 100
mul [byte ptr si]
add [numB], ax
jmp Phase_final
B1Digit:
dec si
push [si]
pop [numB]
jmp Phase_final
B2Digit:
dec si
push [si]
pop [numB]
dec si
mov al, 10
mul [byte ptr si]
add [numB], ax
Phase_final:
mov ax, 32768 ;This is where I want the formula calculation to be performed.
mul [numR] ;as you can see, I divided 65536 by two so it could fit in register ax
Exit:
mov ax, 4C00h
int 21h
;-----------------------------------------
;DetermineNumber - Determines the number input from the user
;-----------------------------------------
;Input:
; bl <- attribute of character
;Output:
; [num] <- (digit 1, digit 2, digit 3) ,Written number
;Registers:
; ah, al, bh, bl, dh, dl, cx, si
;-----------------------------------------
Proc DetermineNumber
mov si, offset num
@@Determine_number:
call ReadKeyInput
cmp al, 48
je @@0
cmp al, 49
je @@1
cmp al, 50
je @@2
cmp al, 51
je @@3
cmp al, 52
je @@Mid1_4
cmp al, 53
je @@Mid1_5
cmp al, 54
je @@Mid1_6
cmp al, 55
je @@Mid1_7
cmp al, 56
je @@Mid1_8
cmp al, 57
je @@Mid1_9
cmp al, 27
je @@Mid1_ESC
cmp al, 13
je @@Mid1_Enter
@@0: cmp [count], 3
je @@Determine_number
mov [byte ptr si], 0
inc [count]
inc si
mov al, '0'
call PrintCharacter
jmp @@Determine_number
@@1: cmp [count], 3
je @@Determine_number
mov [byte ptr si], 1
inc [count]
inc si
mov al, '1'
call PrintCharacter
jmp @@Determine_number
@@2: cmp [count], 3
je @@Determine_number
mov [byte ptr si], 2
inc [count]
inc si
mov al, '2'
call PrintCharacter
jmp @@Determine_number
@@3: cmp [count], 3
je @@Determine_number
mov [byte ptr si], 3
inc [count]
inc si
mov al, '3'
call PrintCharacter
jmp @@Determine_number
@@Mid1_Determine_number: jmp @@Determine_number
@@Mid1_4: jmp @@4
@@Mid1_5: jmp @@5
@@Mid1_6: jmp @@6
@@Mid1_7: jmp @@Mid2_7
@@Mid1_8: jmp @@Mid2_8
@@Mid1_9: jmp @@Mid2_9
@@Mid1_ESC: jmp @@Mid2_ESC
@@Mid1_Enter: jmp @@Mid2_Enter
@@4: cmp [count], 3
je @@Mid1_Determine_number
mov [byte ptr si], 4
inc [count]
inc si
mov al, '4'
call PrintCharacter
jmp @@Mid1_Determine_number
@@5: cmp [count], 3
je @@Mid1_Determine_number
mov [byte ptr si], 5
inc [count]
inc si
mov al, '5'
call PrintCharacter
jmp @@Mid1_Determine_number
@@6: cmp [count], 3
je @@Mid1_Determine_number
mov [byte ptr si], 6
inc [count]
inc si
mov al, '6'
call PrintCharacter
jmp @@Mid1_Determine_number
@@Mid2_Determine_number: jmp @@Determine_number
@@Mid2_5: jmp @@5
@@Mid2_6: jmp @@6
@@Mid2_7: jmp @@7
@@Mid2_8: jmp @@8
@@Mid2_9: jmp @@9
@@Mid2_ESC: jmp @@ESC
@@Mid2_Enter: jmp @@Enter
@@7: cmp [count], 3
je @@Mid2_Determine_number
mov [byte ptr si], 7
inc [count]
inc si
mov al, '7'
call PrintCharacter
jmp @@Mid2_Determine_number
@@8: cmp [count], 3
je @@Mid2_Determine_number
mov [byte ptr si], 8
inc [count]
inc si
mov al, '8'
call PrintCharacter
jmp @@Mid2_Determine_number
@@9: cmp [count], 3
je @@Mid2_Determine_number
mov [byte ptr si], 9
inc [count]
inc si
mov al, '9'
call PrintCharacter
jmp @@Mid2_Determine_number
@@ESC: call EndProgram
@@Enter:
cmp [count], 0
je @@Mid2_Determine_number
ret
ENDP DetermineNumber
;-----------------------------------------
;ReadKeyInput - Reads key input
;-----------------------------------------
;Input:
; Keyboard key press
;Output:
; ah <- scan code, al <- ascii code
;Registers:
; ah, al
;-----------------------------------------
Proc ReadKeyInput
mov ah, 00h
int 16h
ret
ENDP ReadKeyInput
;----------------------------------------------------------------
;PaintScreen - Paints the screen in a specific color
;----------------------------------------------------------------
;Input:
; bl -> color
;Output:
; Printed message
;Registers:
; ah, al, bh, bl, cx
;----------------------------------------------------------------
PROC PaintScreen
mov ah, 09h
mov bh, 0 ; page number
mov cx, 2000 ; count of characters to write
mov al, '' ; character to write
int 10h
ret
ENDP PaintScreen
;----------------------------------------------------------------
;PrintMessage - Prints a message
;----------------------------------------------------------------
;Input:
; bp -> offset of message, bl -> attribute, dl -> Starting column, dh -> Starting row, cx -> length
;Output:
; Printed message
;Registers:
; ah, al, bh, cx, dx, es, bp
;----------------------------------------------------------------
PROC PrintMessage
mov ah, 13h ; video page number
mov bh, 0
mov al, 0 ; 0-3 indicating mode
push ds
pop es ; es:bp pointer to string to be written
int 10h
ret
ENDP PrintMessage
Proc EndProgram
mov dh, 0
mov dl, 0
call SetCursorPosition
mov bl, 0Fh
call PaintScreen
mov ax, 4C00h
int 21h
ret
ENDP EndProgram
;----------------------------------------------------------------
;SetCursorPosition - Sets Cursor Position
;----------------------------------------------------------------
;Input:
; dl -> Column, dh -> Row
;Output:
; Printed message
;Registers:
; ah, bh, dh, dl
;----------------------------------------------------------------
Proc SetCursorPosition
mov bh, 0
mov ah, 2h
int 10h
ret
ENDP SetCursorPosition
Proc PrintCharacter
mov ah, 09h
mov bh, 0 ; page number
mov cx, 1 ; count of characters to write
int 10h
inc dl
call SetCursorPosition
ret
ENDP PrintCharacter
END start
這裏是start.txt的內容:
msg db "Press any key to continue"
red db "Please type in the value of RED"
green db "Please type in the value of GREEN"
blue db "Please type in the value of BLUE"
final db "Your color code is $"
處理器:Intel 8086,彙編:TASM
當紅色爲0,綠色爲1,藍色爲500時,你想要什麼結果? 756? (通常這種24位格式的r/g/b值限於8位,即僅限於0-255,不是「三位數」)。 – Ped7g