汇编语言 编写一个程序,将AL寄存器中的一位十六进制数转化成ASCII码 显示输出

作者&投稿:仲长若 (若有异议请与网页底部的电邮联系)
填入适当指令,使程序段能实现将AL中低位十六进制数转换为ASCII码~

用Ollydbg【汉化版叫 OLLYICE】随便打开一个程序,在反汇编代码区,右键菜单->汇编,在对话框中填入汇编语句,按"汇编" 即可在反汇编代码区看到该语句的机器码。 同样,在反汇编代码区,右键->二进制->编辑,填入机器码,把保持大小的勾去掉,点确定,即可在反汇编代码区看到该机器码的汇编语句。

汇编是复杂的,可以下载MASM或者Radasm编译如下代码,在linux平台 可以直接用gcc自带的as汇编器进行编译。
DATA SEGMENT DATA1 DB ? DATA2 DB 2 DUP(?) DATA20 DB 2 DUP(?) DATA3 DB 'Input Error, Please Enter Again!','$' DATA ENDS STACK SEGMENT DB 5 DUP(?) STACK ENDS CODE SEGMENT ASSUME CS:CODE, DS:DATA,SS:STACK START:MOV AX,DATA MOV DS,AX MOV AX,STACK MOV SS,AX MOV BX,0 INPUT:MOV AH,01H INT 21HCMP AL,51H;判断输入的字符是否为Q JE EXIT ;如果是Q就退出 CMP AL,71H;判断输入的字符是否为q JE EXIT;如果是Q就退出PUSH AX;把从键盘输入的字符的ASCII存到堆栈段 SUB AL,30H ;判断是否为数字 CMP AL,00HJL INDI ;如果不是就提示错误 CMP AL,09H ; MOV BL,AL ; JLE OUTPUT2;如果是数字就输出 POP AX ;把AL的值取出来PUSH AX ; MOV BL,AL SUB AL,41H;判断是否为大写字母A到F CMP AL,00H JL INDI;如果不是就提示错误CMP AL,06H JL CHANGE POP AXPUSH AX MOV BL,AL SUB AL,61H;判断是否为小写字母a到f CMP AL,00H JL INDI ;如果不是就提示错误 CMP AL,06H JL CHANGE POP AXJMP INDICHANGE:MOV SI,0MOV DI,0MOV CL,4MOV AL,BLAND AL,11011111B;统一换为大写字母再转换,如果是大写字母就不变SUB AL,31HMOV BL,ALAND AL,0FH ;与运算,取低位MOV [DATA2+SI],AL ;把个位数存到DATA2中MOV AL,BLSAR AL,CL ;算术右移,取高位MOV[DATA20+DI],AL;把十位数存到DATA20中OUTPUT1: MOV DL,48H;输出十六进制符号HMOV AH,02HINT 21HMOV DL,3DH ;输出等号‘=’MOV AH,02HINT 21HMOV DL,[DATA20+DI];输出十位数ADD DL,30HMOV AH,02HINT 21HMOV DL,[DATA2+SI];输出个位数ADD DL,30HMOV AH,02HINT 21HMOV DL,20HMOV AH,02HINT 21HJMP INPUT;跳到输入数字 OUTPUT2: MOV DL,48H ;输出数字MOV AH,02HINT 21HMOV DL,3DHMOV AH,02HINT 21HMOV DL,BLADD DL,30HMOV AH,02HINT 21HMOV DL,20HMOV AH,02HINT 21HJMP INPUTINDI:MOV DL,20H ;提示子程序MOV AH,02HINT 21HMOV DX,OFFSET DATA3 ;显示提示信息MOV AH,09HINT 21HJMP INPUT EXIT:MOV AH,4CHINT 21HCODE ENDSEND START

;将AL寄存器中的一位十六进制数转化成ASCII码,显示输出。
;推荐答案,写的并非是一位。

;程序如下:

ASSUME CS:CODE
CODE SEGMENT
START:
MOV AL, 0FH ;在这里可写 00H~0FH,这就是一位16进制数
AND AL, 0FH ;无用位清零,保留该数字
;下面是变成ASCII码
CMP AL, 0AH
JB NEXT
ADD AL, 07H
NEXT:
ADD AL, 30H
;下面是显示输出
MOV DL, AL ;送到DL
MOV AH, 2 ;显示单个字符
INT 21H ;显示
MOV AH, 4CH ;结束程序
INT 21H ;返回DOS
CODE ENDS
END START

给你一个例子吧~~王爽汇编那本书的课程设计一中的代码

assume cs:codesg
data segment
db '1975','1976','1977','1978','1979','1980','1981','1982','1983'
db '1984','1985','1986','1987','1988','1989','1990','1991','1992'
db '1993','1994','1995'
;以上是表示21年的21个字符串

dd 16,22,382,1356,2390,8000,16000,24486,50065,97479,140417,197514
dd 345980,590827,803530,1183000,1843000,2759000,3753000,4649000,5937000
;以上是表示21年公司收入的21个dword型数据

dw 3,7,9,13,28,38,130,220,476,778,1001,1442,2258,2793,4037,5635,8226
dw 11542,14430,15257,17800
;以上是表示21年公司雇员人数的21个word型数据
data ends

showdata segment
db 10 dup(0)
showdata ends

datashop segment
db 10 dup(0)
datashop ends

codesg segment
start:
;数据
mov ax,data
mov ds,ax
;栈
mov ax,showdata
mov ss,ax
mov sp,12
;显示
mov ax,0b800h
mov es,ax
;初始化数据
mov cx,21
mov bx,0
mov bp,320

s: ;显示年份
call showyear
call showinfo
call showperson
call shownumber
add bx,4
add bp,160
loop s
mov ax,4c00h
int 21h

showyear:
;准备
push cx
mov cx,4
mov si,0
mov di,0
;开始
yearlp: mov al,[bx+si+0h]
mov es:[bp+di+0h],al
mov byte ptr es:[bp+di+1h],01000000b
inc si
add di,2
loop yearlp

pop cx
ret

showinfo:
;准备
push cx
;用于存储数据
mov ax,datashop
mov es,ax
;取出数字
mov si,0
mov ax,[bx+si+54h]
add si,2
mov dx,[bx+si+54h]
;规划
push ds
push es
pop ds
push bx
mov bx,0b800h
mov es,bx
;SI用来存放位置
mov si,1
;处理dx是两位数
cmp dx,0ah
ja div3
;处理dx是一位数
cmp dx,0
ja div2
;处理dx是0
mov di,10
jmp div1

div3:
mov di,100
div di
;把商压栈
push ax
;转移余数
mov ax,dx
xor dx,dx
;先处理余数
mov di,10
div di
mov [si],dl
inc si
xor dx,dx
div di
mov [si],dl
inc si
;恢复
pop ax
jmp div1

div2:
mov di,10
div di
mov [si],dl
inc si

div1:
mov bx,10
mov di,20h

call startdiv

pop bx
pop ds
pop cx
ret

showperson:
;准备
push cx
;START
;确定位置
mov ax,bx
xor dx,dx
mov di,2
div di
;取出数字
mov si,ax
mov ax,[si+0a8h]
;准备存储
push ds
push bx
mov di,40h
mov si,1
call show
;END
;恢复
pop bx
pop ds
pop cx
ret

shownumber:
;准备
push cx
;取出资金数字
mov si,0
mov ax,[bx+si+54h]
add si,2
mov dx,[bx+si+54h]
;准备
push dx
push ax
;取出人数数字
;确定位置
mov ax,bx
xor dx,dx
mov di,2
div di
;取出数字
mov si,ax
mov di,[si+0a8h]
;恢复被除数
pop ax
pop dx
;开始除法
div di
;储存商
push ds
push bx
mov di,60h
mov si,1
call show

;恢复
pop bx
pop ds
pop cx
ret

show:
mov cx,datashop
mov ds,cx
mov bx,10

startdiv:
xor dx,dx
div bx
mov [si],dl
cmp ax,0
je enddiv
inc si
jmp startdiv

enddiv:
mov cx,si

showwhat:
mov al,[si]
add al,30h
mov es:[bp+di],al
mov es:[bp+di+1h],al
dec si
add di,2
loop showwhat

ret
codesg ends
end start

这个在debug中运行-g可以查看效果

assume cs:code

code segment
start:
mov al,2Fh ;现在假设al=12H
mov ch,2 ;循环次数
mov bl,al
next: mov cl,4 ;移动的位数
rol bl,cl ;循环左移4位,为什么要用循环左移动呢,因为这样不会改变al的值(循环结束后)
mov al,bl
and al,0Fh ;将高4位清0
or al,30h ;也可以用add al,30h,转换成十六进制
cmp al,3ah ;看是否小于10,因为十六进制大于10,就会有变化
jl done
add al,7h
;打印出来
done: mov dl,al
mov ah,2
int 21h
dec ch
jnz next
mov ax,4c00h
int 21h

code ends
end start

PS:若有不明白的地方,可以追问


金州区17567217584: 汇编语言 编写一个程序,将AL寄存器中的一位十六进制数转化成ASCII码 显示输出 -
盛梵丙酸: ;将AL寄存器中的一位十六进制数转化成ASCII码,显示输出. ;推荐答案,写的并非是一位.;程序如下:ASSUME CS:CODE CODE SEGMENT START:MOV AL, 0FH ;在这里可写 00H~0FH,这就是一位16进制数AND AL, 0FH ;无...

金州区17567217584: 用汇编语言怎么将AL寄存器最高位置1 -
盛梵丙酸: 用汇编语言将AL寄存器最高位置1,可以使用“或”操作指令: OR AL,80H指向该指令后,AL寄存器最高位置1,其它位不变.

金州区17567217584: 汇编语言:编写一个程序,显示AL寄存器中的两位十六进制数 -
盛梵丙酸: data segment data ends stack segment db 256 dup(?) stack ends code segment assume cs:code, ds:data, ss:stack start: mov ax, data mov ds, ax mov ax, stack mov ss, ax mov al, 0c5h call disp_al mov al, 065h call disp_al mov ah, 04ch int 21h;disp...

金州区17567217584: 用汇编语言编程,将8位寄存器(如AL)中的数值以十进制的形式显示在计 -
盛梵丙酸: code segment assume cs:code org 100hstart:push cs pop ds push cs pop es mov al,99 call dispnum mov ah,4ch int 21hdispnum proc near push ax push bx push cx push dx push si push di push bp pushf ; 将要显示的数据放入AL中 mov ah,0 mov cl,...

金州区17567217584: 急!!汇编:程序1.把ax寄存内容分4组每组4位,然后把这4组数分别放在AL,BL,CL,DL中 -
盛梵丙酸: ;1.把ax寄存内容分4组每组4位,然后把这4组数分别放在AL,BL,CL,DL中 assume cs:code code segment start: mov ax,1234h mov bx,ax mov cx,ax mov dx,ax and al,0fh ;al中是4 mov cl,4 shr bl,cl ;bl中是3 and ch,0fh ;ch中是2,先存在这,最后再给cl ...

金州区17567217584: 用汇编语言编写完成下列功能的小程序段. -
盛梵丙酸: 1、OR AL,00110000B 或者OR AL,0C0H 2、MOV AL,ES:[COUNT] MOV A...

金州区17567217584: 用汇编语言编写程序段,实现从键盘输入十个一位10进制数后累加以非压缩BCD码形式存放在AH和AL中. -
盛梵丙酸: code segmentassume cs:codeorg 100h start:jmp bbb lfcr db 13,10,'$'bbb:push cspop ds call inputnummov ah,9lea dx,lfcrint 21h lea si,arraymov ch,0mov cl,byte ptr[num]mov ax,0 lp:add ax,word ptr[si]daa ; 十进制加法调整指令...

金州区17567217584: 汇编语言程序设计题实现有符号数绝对值的加法运算设字节变量X和Y中存放的是16位有符号数,试编写程序实现|X|+|Y|结果送AL的计算 -
盛梵丙酸:[答案] mov ax,x test ah,0xF0 //是否为负数 jnz nz: not ax nz: mov dx,ax mov ax,y test ah,0xF0 ;是否为负数 jnz nz: not ax nz: add ax,dx ;高16位在dx,低16位在ax 把结果送入al是不行的

金州区17567217584: 汇编语言程序要求输入一个16进制有符号数到ax(al也可)寄存器?
盛梵丙酸: mov ax,123h not ax

金州区17567217584: 求用汇编语言编写两位非压缩bcd相乘的程序 -
盛梵丙酸: ; 本程序通过编译,运行正确 Code SegmentAssume CS:Code,DS:Code Start: mov al,8mov bl,7mul blaam ;用于调整寄存器AL之值,该值是由二个单BCD码字节用无符号乘指令MUL所得的积.其调整规则:AH←AL/10(商),AL←AL%10(余数) Exit_Proc: mov ah,4ch ;结束程序int 21h Code ENDSEND Start ;编译到此结束

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网