1. 程式人生 > >匯編入門學習筆記 16X+Y

匯編入門學習筆記 16X+Y

star gpo 表達式 入門學習 表達 數據 style art 語言

題目:設X和Y均為16位無符號數,寫一個求表達式16X+Y的值

加法實現:

代碼如下:

DATAS SEGMENT
    ;此處輸入數據段代碼
    XXX DW 1234H  ;設X為1234H
    YYY DW 5678H  ;設Y為5678H
    ZZZ DD ?      ;用Z來保存最後運算的結果                                                                                                                                                                     
DATAS ENDS STACKS SEGMENT ;此處輸入堆棧段代碼 STACKS ENDS CODES SEGMENT ASSUME CS:CODES,DS:DATAS,SS:STACKS START: MOV AX,DATAS MOV DS,AX MOV AX,XXX ;講X送至AX,作為三十二位結果的低十六位儲存 XOR DX,DX ADD AX,AX ;X*2 AX是低十六位,無需接收進位用ADD ADC DX,DX ;DX 是高十六位,需要接收進位,用ADC ADD AX,AX ;X*4
ADC DX,DX ADD AX,AX ;X*8 ADC DX,DX ADD AX,AX ;X*16 ADC DX,DX ADD AX,YYY ;X+Y; ADC DX,DX MOV WORD PTR ZZZ,AX ;將低16位AX中的數據,復制傳送到變量Z所指向的兩個字節16位存儲單元中。 ;因為ZZZ定義的是雙字,所以不能直接MOV ZZZ,AX 而是使用WORD PTR 將ZZZ變量地址當作字變量來使用 MOV WORD PTR ZZZ+2,DX ;;將高16位DX中的數據傳送到相應位置,因為前面低十六位占兩個內存單元,所以這裏從兩個內存單元之後進行儲存
MOV AH,4CH INT 21H CODES ENDS END START

乘法實現:

DATAS SEGMENT
    ;此處輸入數據段代碼
    XXX DW 1234H  ;設X為1234H
    YYY DW 5678H  ;設Y為5678H
    ZZZ DD ?      ;用Z來保存最後運算的結果                                                                                                                                                                     
DATAS ENDS

STACKS SEGMENT
    ;此處輸入堆棧段代碼
STACKS ENDS

CODES SEGMENT
    ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
     MOV AX,DATAS
    MOV DS,AX
    
    MOV AX,XXX ;講X送至AX,作為三十二位結果的低十六位儲存
    MOV DX,16
    MUL DX
   ;MUL 匯編語言無符號數乘法指令   
   ;格式:MUL SRC   執行的操作:   
   ;字節操作數:(AX)←(AL)*(SRC)   
   ;字操作數:(DX,AX)←(AX)*(SRC)   
    ADD AX,YYY ;X+Y;
    ADC DX,DX
    
    MOV WORD PTR ZZZ,AX ;將低16位AX中的數據,復制傳送到變量Z所指向的兩個字節16位存儲單元中。
    ;因為ZZZ定義的是雙字,所以不能直接MOV ZZZ,AX 而是使用WORD PTR 將ZZZ變量地址當作字變量來使用
    MOV WORD PTR ZZZ+2,DX ;;將高16位DX中的數據傳送到相應位置,因為前面低十六位占兩個內存單元,所以這裏從兩個內存單元之後進行儲存
    
    MOV AH,4CH
    INT 21H
CODES ENDS
    END START

匯編入門學習筆記 16X+Y