汇编语言计算2^12保存在AX寄存器,并以十进制形式输出(16位和32位)

win一、计算2^12保存在AX中(王爽汇编语言第二版p100):

		mov  	cx,12		;循环12次
		mov     ax,1		;初始化AX
s:		add		ax,ax
		loop  	s			;执行完loop后,要显示的数字2^12 已经在寄存器AX

二、AX寄存器以显示说明:

本例中,2^12=4096,故AX=1000H

则输出字符为4096

原理:
ax为十六位寄存器,所以输出十进制数范围为0 - 65535,最大五位数,故设置CX=5,LOOP语句实现算法:
4096/10000= 商0  余数4096    ; 根据十进制书写习惯,不输出前面的0字符 ,需要在输出循环里判断
4096/1000= 商4  余数96         ;输出4
96/100= 商0  余数96              ;输出0
96/10=  商9  余数6                 ;输出9
6/1=  商6  余数0                     ;输出6
把每次所得商加上48即可得到相应数字的ASCII码,

三、完整代码:


code segment
assume cs:code,ds:data,ss:stack
start:
        mov     ax,data
        mov     ds,ax
		
	mov  	cx,12		;循环12次
	mov     ax,1		;初始化AX
s:	add		ax,ax
	loop  	s			;执行完loop后,要显示的数字2^12 已经在寄存器AX

        mov     si, offset divisors
        mov     di, offset results                     
        mov     cx,5   
aa:
        mov     dx,0            
        div     word ptr [si]   ;除法指令的被除数是隐含操作数,此处为dx:ax,商ax,余数dx
        add     al,48           ;商加上48即可得到相应数字的ASCII码
        mov     byte ptr [di],al        
        inc     di                                
        add     si,2                           
        mov     ax,dx                        
        loop    aa
        mov     cx,4    
        mov     di, offset results 
bb:
        cmp     byte ptr [di],'0'   ;不输出前面的0字符    
        jne     print
        inc     di                           
        loop    bb
print:
        mov     dx,di                       
        mov     ah,9
        int     21h                   
        mov     ax,4C00h       
        int     21h
code ends
data    segment
divisors        DW 10000, 1000, 100, 10, 1
results          DB 0,0,0,0,0,"$"        ;存放五位数ASCII码
data ends
stack segment STACK
stack ends
end start

四、DOSBOX运行截图(dosbox已安装masm611,并真确设置环境变量)

五、win32汇编(在win10 64位下可执行)

需要下载masm32,解压到d:根目录下:

设置环境:var.bat

@echo off
set include=D:\masm32\include
set lib=D:\masm32\lib
set path=D:\masm32\bin;%path%
echo on

计算2^12的win32汇编代码:

.386
.model flat, stdcall

include \masm32\include\msvcrt.inc
includelib \masm32\lib\msvcrt.lib

.data
    szFmt db '2^12=%d;', 0

.code
start:
	mov 	eax, 0
	mov     ax,1		;初始化AX

	mov 	ecx, 0		;初始化循环次数,设为12次
	mov  	cx,12

s:
	add		ax,ax
	loop  	s			;执行完loop后,要显示的数字2^12 已经在寄存器AX

    invoke crt_printf, addr szFmt, eax
    ret
end start

汇编,并运行:

D:\masm32\MyPrg>type var.bat
@echo off
set include=D:\masm32\include
set lib=D:\masm32\lib
set path=D:\masm32\bin;%path%
echo on
D:\masm32\MyPrg>var

D:\masm32\MyPrg>ml /coff 5_1.asm /link /subsystem:console
Microsoft (R) Macro Assembler Version 6.14.8444
Copyright (C) Microsoft Corp 1981-1997.  All rights reserved.

 Assembl
  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要将 AX 寄存器中的数据转换为十进制数字并输出到屏幕上,可以使用类似于前面提到的 itoa 函数的方法,将 AX 寄存器中的数据保存到变量中,然后将变量转换为字符串并输出。以下是一个简单的例子: ``` section .data output_msg db '输出的数字为: ' number db '0000' ; 四个数字的字符串形式,初始值为 0 section .text global _start _start: ; 将 AX 寄存器中的数据保存到变量中 mov bx, ax mov ecx, number call itoa ; 输出 "输出的数字为: " 提示信息 mov edx, output_msg mov eax, 4 mov ebx, 1 int 0x80 ; 输出数字 mov edx, number mov eax, 4 mov ebx, 1 int 0x80 ; 退出程序 mov eax, 1 xor ebx, ebx int 0x80 ; 将整数转换为字符串 ; 输入:ax - 整数,ebx - 基数,ecx - 存储字符串的地址 ; 输出:ecx - 存储转换后的字符串的地址 itoa: push edx push esi push edi mov esi, ecx ; esi 指向字符串的起始地址 mov edi, ecx ; edi 指向字符串的末尾 cmp ax, 0 ; 处理特殊情况:输入为 0 jne .not_zero mov byte [edi], '0' jmp .finish .not_zero: cmp ax, 0 jl .negative ; 处理负数 .positive: xor edx, edx ; edx 用于保存余数 div ebx ; ax = ax / ebx,dx = ax % ebx add dl, '0' ; 将余数转换为 ASCII 码 mov byte [edi], dl ; 将 ASCII 码保存到字符串中 dec edi ; edi 指向下一个字符 cmp ax, 0 jne .positive jmp .finish .negative: mov byte [esi], '-' inc esi ; esi 指向下一个字符 neg ax ; 取反 jmp .positive .finish: pop edi pop esi pop edx ret ``` 以上代码通过调用 itoa 函数将 AX 寄存器中的数据转换为字符串,并通过系统调用将其输出到屏幕上。如果要输出不同的数据,只需要将数据保存AX 寄存器中即可。值得注意的是,这里将字符串初始值设为 '0000',是为了保证输出的数字始终为四个字符,如果需要输出不同长度的数字,需要相应地修改字符串的初始值。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值