輸入一個無符號十進位數字串,以四位十六進位的形式輸出該串對應的值。

來源:互聯網
上載者:User

DATA SEGMENT
BUF1 DB  20
    DB   ?
    DB 20 DUP(?)
BUF2 DB  20
    DB   ?
    DB 20 DUP(?)
INPUT DB 'Input:$'
OUTPUT DB 'Output:$'
CTRL DB 0DH,0AH,'$'
SHI DW 0AH         ;不能是DB,用DW,要用字乘法
Iint  DW 0
DATA ENDS

STACK SEGMENT
      DB 200 DUP(0)
STACK ENDS

CODE SEGMENT
 ASSUME CS:CODE,DS:DATA,SS:STACK
 
START:
MOV AX,DATA
MOV DS,AX
;輸出提示符‘Input:’
LEA DX,INPUT
MOV AH,9
INT 21H
;輸入數值
LEA DX,BUF1
MOV AH,10
INT 21H
;輸出斷行符號換行
LEA DX,CTRL
MOV AH,9
INT 21H
;把ASCII碼化成十進位

MOV CL,BUF1+1    ;擷取字元個數
LEA SI,BUF1+2     ;首地址
;轉化好的存在Iint中
;因為MUL DL,所以單獨處理第一個字元
MOV BX,0
MOV Dl,[SI]
MOV DH,0
MOV AX,DX
SUB Al,30H
DEC CL
INC SI
NEXT:
;MOV DL,10   ;用這兩行的話,如果是字乘法,那麼結果存在DX,AX中,所以導致轉化成的16進位為4位時,高位元組存 
;MUL 10          ;在DX中,所以老是出錯
MUL [SHI]  
ADD AH,DL
MOV DL,[SI]
MOV BL,DL
SUB BL,30H
ADD AX,BX
DEC CL
INC SI
CMP CL,0
JNE NEXT
MOV [Iint],AX
;把十進位轉化為十六進位
MOV CL,0  ;記錄有多少個資料入棧
MOV AX,[Iint]
MOV DX,0
TO:
MOV BX,16
DIV BX    ;AX/(OPS)==>AL,AH
MOV BX,AX ;儲存商,用於輾轉相除
PUSH DX      ;把餘數入棧,所以要把商賦為0
INC CL
MOV AX,BX   ;還原商,用於輾轉相除
MOV DX,0    ;消除上次的餘數
CMP AX,0
JNE TO

;處理位元
MOV BL,4
SUB BL,CL
MOV CL,BL
CMP CL,0
JBE AAAA    ;小於等於0,則說明已經有4位了
BU0:
MOV AX,0H
PUSH AX
DEC CL
CMP CL,0
JNE BU0

AAAA:
;出棧
MOV SI,0
MOV CL,0
OUTSTACK:
POP AX
CMP AL,9   ;把16進位轉化成ascii
JA DAYU9
ADD AL,30H
JMP XIAOYU9
DAYU9:
ADD AL,37H
XIAOYU9:
MOV [SI][BUF2],AL
INC SI
INC CL
CMP CL,4
JNE OUTSTACK
MOV [SI][BUF2],'H'
;輸出提示提示符
LEA DX,OUTPUT
MOV AH,9
INT 21H

;輸出數值
LEA SI,BUF2
MOV CL,5
PRINT:
MOV DX,[SI]
MOV AH,2
INT 21H
INC SI
DEC CL
JNZ PRINT

MOV AH,4CH
INT 21H
CODE ENDS

END START

由於MUL這個地方沒注意,搞得好糾結,故貼上其解釋,前車之鑒啊

MUL 無符號數乘法指令
格式:MUL SRC
執行的操作:
位元組運算元:(AX)←(AX)*(SRC)
字運算元:(DX,AX)←(AX)*(SRC)

·IMUL 帶符號數乘法指令
格式:IMUL SRC
執行的操作:與MUL相同,擔必須是帶符號數,而MUL是無符號數。

在乘法指令裡,目的運算元必須是累加器,字運算為AX,位元組運算為AL。兩個8位元相乘得到的是16們乘積存放在AX中,兩個16位元相乘得到的是32位乘積,存放在DX,AX中,其中DX存放高位字,AX存放低位字。指令中的源運算元可以使用除立即數方式以外的任一種定址方式。 
MUL指令和IMUL指令的使用條件是由數的格式決定的。很明顯(11111111b)*(11111111b)當把它看作無符號數時應為255d×255d=65025d,而把它看作帶符號數時則為(-1)×(-1)=1。因此必鬚根據所要相乘的格式來決定選用哪一種指令。
乘法指令對除CF和OF以外的條件碼位無定義(注意:無定義的意義和不影響不同,無定義是指指令執行後這些條件碼位的狀態不定,而不影響則是指該指令的結果並不影響條件碼,因而條件碼應保持原狀態不變。),對於MUL指令,如果乘積的高一半為0,即位元組操作的(AH)或字操作的(DX)為0,則CF和OF均為1。這樣的條件碼設定可以用來檢查位元組相乘的結果是位元組還是字,或者可以檢查字相乘的結果是字還是雙字。對於IMUL指令,如果乘積的高一半是低一半的符號擴充則CF和OF均為0,否則就均為1。

例:
      
如(AL)=0B4H,(BL)=11H求執行指令IMUL BL和MUL BL後的乘積值。
      (AL)=0B4H為無符號數的180D,帶符號數的-76D,
      (BL)=11H為無符號數的17D,帶符號數的17D,
執行IMUL BL的結果為:
    (AX)=0FAF4H=-1292D
    CF=0F=1

執行MUL的結果為:
    (AX)=0BF4H=3060D
    CF=0F=1

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.