汇编语言中,怎么单独显示某个寄存器的内容

汇编语言中,怎么单独显示某个寄存器的内容我需要单独显示eax,然后单独显示ebx,且因为程序原因不能用把ebx赋值给eax显示这种方法。但是几个显示的句子都只能显示eax,求解决方法。

回答你这个问题前我需要阐明几个相关概念 比较长 你可能没兴趣看完
不过没有关系,毕竟知识是没有那么容易获得的
OK 回到正题 你是想要显示在寄存器的值
那么 我首先假设:
您的运行环境是有标准输入输出设备(键盘-显示器)的
那么我再假设您的运行环境是在某种OS调度下的,
当然无OS也可以输出你想要的字符,
但是这需要你自己从硬盘MBR自举自己初始化设备自己写设备驱动对硬件IO进行读写
这完全可行,但这确实不切合实际 毕竟有一大堆成熟的OS提供了系统调用接口
也就是API 这样的中间层帮助你操作这些标准输入输出设备显示字符 为何要重新造一堆没啥用的轮子呢?
那么好了 到这里 我再假设亲 您的电脑不是MAC 也不是 linux 而是被程序员最为鄙视的windows系统
毕竟这个系统最为广泛,而且易用是吧 大多数人入门PC都是微软的锅不是吗?
那么说到这里了 假设了辣么多 麻痹答主还是没有说到底怎么将这些破烂寄存器里的数字变成ASCII字符显示在标准输入输出设备上啊
亲,角多嘛呆 概念如果没有阐明 亲你也是非常糊涂的不是吗?
那么再回主题
显然 OS不可能让你直接操作 显存和I/O端口往显示器上丢字 第一,这不安全 系统资源必须由核心代码独占 其二,大多数用户对具体如何操纵显卡往显示器上丢字这种又臭又长的破过程不感兴趣
毕竟你只是想丢几个字到垃圾显示器上嘛 那么就用系统给的API接口不就完了?
那么调用系统API接口 那么就需要声明API库 的二进制调用头文件
这个有人帮你做过这事了 无论是masm32 还是radasm 还是masmplus啥的 都集成了微软的MASM库调用 inc 头 你只要找到相应的头文件include一下 然后在 invoke一下 他们提供的函数就行了
当然编译参数里不要忘记加上命令行程序的开关
最后还有一件事,也就是传说中的 二进制整形 如何变成 16进制ASCII 或者 10进制ASCII字串 这个一言难尽 还是写一段 HEX2ASCII 的过程给你看一下吧 你参考一下
或者你不愿写这个 调用 itoa() 或者 wsprintf()这样的函数 自己转换一下也是很简单的事....
DATA SEGMENT
A DB 05FH
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START:MOV AX,DATA;置DS段初值
MOV DS,AX
MOV DL,A
MOV CL,4
SHR DL,CL;右移4位获得高4位
ADD DL,030H;0~9加30H,A~F加37H
CMP DL,'9';将双分支转化为单分支
JBE NEXT1
ADD DL,7
NEXT1:MOV AH,2
INT 21H;显示高位十六进制
MOV DL,A
AND DL,0FH;高4位清0获得低4位
ADD DL,30H
CMP DL,'9'
JBE NEXT2
ADD DL,7
NEXT2:MOV AH,2
INT 21
MOV AH,4CH
INT 21H
CODE ENDS
END START
当然这是16bit 版本 其实改成 32版本也不难.... 首先要你看得懂....
另外PS: 你要保护eax的内容 用 push eax 压栈指令不就完了? 要用的时候 pop eax就好了
但是记得堆栈需要后入先出..... 要不爆栈别怪我....追问

虽然我已经解决了,但是写这么长不容易

温馨提示:答案为网友推荐,仅供参考
第1个回答  2017-11-14
X86:把BX赋给AX, LEA AX,[BX];mov AX,BX
mips:把$s2赋给$s1,add $s1,$s2,zero或者addi $s1,$s2,0
ARM:把R2赋给R1,MOV R1, R2
"BI-DIRECTIONAL"(PS/2兼容)(双向模式,允许主机和外设双向通讯)还是"ECP"(Extended Capabilities Ports,扩展功能端口)(默认)。