組合語言:. 將DX暫存器中的二進位制數(3 F 2 E H)以十六進位制數形式顯示在螢幕上;然後換行從
第一題:
CSEG SEGMENT
assume cs:CSEG
MAIN PROC FAR ;主程式入口
mov dx,3f2eh
mov bx,dx
mov cx,4 ;= 這 =
x0: rol bx,1 ;= 些 =
rol bx,1 ;= 是=
rol bx,1 ;=輸=
rol bx,1 ;=出=
mov dl,bl ;
and dl,0fh ;
cmp dl,0ah ;
jl x1 ;
add dl,37h ;
jmp x2 ;
x1: add dl,30h ;
x2: mov ah,02h ;
int 21h ;
loop x0 ;
mov dl,0ah ;換行
int 21h
mov dl,31h ;輸出16
int 21h
mov dl,36h
int 21h
;按任意鍵退出
mov ah,1
int 21h
mov ax, 4c00h ;程式結束,返回到作業系統系統
int 21h
MAIN ENDP
CSEG ENDS
END MAIN
第二題:
CSEG SEGMENT
assume cs:CSEG
MAIN PROC FAR ;主程式入口
mov dx,3f2eh
mov ax,dx
mov bx,0
mov cx,16
x4: ror ax,1
jnc x3
add bx,1
x3: loop x4
mov ax,bx
daa
mov bx,ax
mov cx,4
x5: rol bx,1
rol bx,1
rol bx,1
rol bx,1
mov dl,bl
and dl,0fh
cmp dl,0ah
jl x6
add dl,37h
jmp x7
x6: add dl,30h
x7: mov ah,02h
int 21h
loop x5
;此處新增主程式程式碼
;按任意鍵退出
mov ah,1
int 21h
mov ax, 4c00h ;程式結束,返回到作業系統系統
int 21h
MAIN ENDP
CSEG ENDS
END MAIN
有疑問可以百度HI我= =
1。先顯示3F2EH,再另起一行顯示16? 如下格式?
3F2EH
16
2。個數還是用十六進位制數顯示?
1的個數用十進位制表示的,程式如下:
;7。asm
data segment
string db 3 dup(0),‘$’ ;儲存轉換後的餘數,初始化為30h,餘
;數直接加到對應單元,轉化為ascii碼
data ends
code segment
assume cs:code,ds:data
start:
mov ax,data
mov ds,ax
mov dx , 3F2Eh ;預置dx要顯示的值
push dx
mov bx,dx
mov cl,4 ;移位指令中用於指定移位次數的值
mov dh , 0 ;dh用於記錄迴圈次數,正計數
again: rol bx , cl ;迴圈移位指令,完成顯示後bx值不變
;從高位開始顯示
mov dl , bl ;當前要顯示的4位移至最低位上
and dl , 0fh ;清除高4位
cmp dl , 0ah ;若是0~9,則直接加30H顯示;
;若是A~F,則另外再加7(41H-0AH=30H+7)
jb disp
add dl , 7
disp: add dl , 30h ;不能使用OR DL,30H,是因為數值可能為A~F
mov ah , 2
int 21h
inc dh ;記錄迴圈次數,達到4次,即結束。
cmp dh , 4
jnz again
mov ah , 02h ;回車換行
mov dl , 0ah
int 21h
mov ah , 02h
mov dl , 0dh
int 21h
mov ah,02h
mov dl,‘1’
int 21h
mov dl,‘6’
int 21h
pop dx
xor bl,bl
next1: and dx,dx;若dx為0,移位結束
jz next2
shl dx,1
adc bl,0
jmp next1
next2:next2: mov bh,0
mov cx , 10 ;將bl中資料轉換成十進位制輸出,cx為數制轉換的基數
lea si , string+4 ;si指標指向緩衝區末尾,依次減量,使餘數倒序排列
mov ax , bx ;要轉換的資料保存於ax
next3: mov dx , 0 ;除法轉換,要使用32位被除數,dx為無符號數的0擴充套件,每次除法都要進行擴充套件
div cx ;除法後,ax為商,準備下次除法;dx為餘數,值為0~9,
;dl可以保存於string中,用於顯示
add dl , 30h ;將餘數轉換為字元,保存於si指定的緩衝區中
mov [si] , dl
dec si ;指標修改,準備存放下一個餘數
cmp ax , 0 ;直到商為0,轉換結束
jz over
jmp next3
over: mov dx , si ;使用09號DOS功能呼叫,顯示轉換後的字串
inc dx
mov ah , 09h
int 21h
mov ax , 4c00h
int 21h
code ends
end start
/////結果如下:16後面的10是1的個數
J:\masm611>7
3F2E
1610