我試圖序列中只打印的數字即轉換十六進制/十進制數(Assemly-TASM)
1,2,3,4,5,6,7,8,9,10,11 ,12,13,14,15,16,17,18,19,20
使用循環, 首先我將每個數字轉換成Hexa打印它重置爲十進制增量1,然後打印下一個,直到數字等於9, 當數字等於9時,我使用DAA簡單地輸入數字,在旋轉和移位數字後,我最終將結果存儲在字符串中。
輸出僅僅是罰款,直到16,但16後的順序重演,
所需的輸出:
1,2,3,4,5,6,7,8, 9,10,11,12,13,14,15,16,17,18,19,20
電流輸出 1,2,3,4,5,6,7,8,9, 10,11,12,13,14,15,16,11,12,13,14,15
爲什麼會這樣呢? ???
這裏是我的代碼,
MOV CX,20 ;Number of Iterations
MOV DX,1
L1:
PUSH DX
ADD DX,30H
MOV AH,02H ;PRINT Content of DX
INT 21H
POP DX
ADD DX,1
CMP DX,09d ;If number is Greater than 9 jump to L2
JA L2
LOOP L1
L2:
PUSH DX
MOV AX,DX
DAA ;Convert to the Decimal
XOR AH,AH ;SET AH to 0000
ROR AX,1
ROR AX,1
ROR AX,1
ROR AX,1
SHR AH,1
SHR AH,1
SHR AH,1
SHR AH,1
ADC AX,3030h
MOV BX,OFFSET Result
MOV byte ptr[BX],5 ; Length of the String
MOV byte ptr[BX+4],'$' ;5th position of string , $=Terminator
MOV byte ptr[BX+3],AH ;2nd Number onto 4th position
MOV byte ptr[BX+2],AL ;3rd number onto 3rd Position
MOV DX,BX
ADD DX,02 ;1st 2 positions of String are type of string and
length respectively
MOV AH,09H ;to print the string
INT 21H
POP DX
ADD DX,1
LOOP L2
MOV AH,4CH ;Return control to the DOS
INT 21H
P.S:我把幫助從這個圖表中瞭解數字。
http://www.cheat-sheets.org/saved-copy/ascii.png
你應該緊湊化你的代碼,即G。使用'ror ax,4'一次,而不是四次'ror ax,1'。另外,並不是每個人都知道中斷調用是幹什麼的(我從來沒有在DOS下進行過彙編),如果你在這樣的代碼行中寫下簡短的註釋,就會更容易知道代碼的作用。 - 請儘可能多地移除空行。空行對於可讀性來說非常好,可以分隔邏輯代碼塊,但是多個後續的空行只是過分地擴展了列表。 – IdiotFromOutOfNowhere
我在x64中使用DosBox,我認爲這就是爲什麼我無法直接使用ROR,4或SHR,4,我必須單獨使用它們。 和評論已添加 – micheller
IIRC,你正在使用TASM,對不對?從我的英特爾手冊中可以看出,該彙編程序可能是一個缺陷,即通過立即旋轉/移位也可以以16位模式工作。無論如何,'mov word ptr [BX + 2],AX'怎麼辦 - 會有用嗎? ;-) – IdiotFromOutOfNowhere