汇编语言之div命令

div是除法指令,使用div做除法时应该注意
1)除数:有8位和16位,在reg或者内存中
2)被除数:默认放在被除数:默认放在AX或者AX和DX中,如果除数是8位,被除数是16位,默认放在AX中,如果除数是16位,被除数是32位,则放在AX和DX中,AX放低16位,DX放高16位
3)结果:如果除数是8位,则结果的AL放商,AH放余数,如果除数是16位,AX放商,DX放余数

div byte ptr [bx+si+8]
含义:(al)=(ax)/((ds)*16 +(bx)+(si)+8)的商
(al)=(ax)/((ds)*16 +(bx)+(si)+8)的余数

div word ptr [bx+si+8]
含义:(ax)=(ax)/((ds)*16 +(bx)+(si)+8)的商
(dx)=(ax)/((ds)*16 +(bx)+(si)+8)的余数

  • 4
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
以下是一个使用 x86 汇编语言实现的转换程序,可以在 Windows 平台上运行: ```assembly ; 这是一个将数字转换为二进制和十六进制的程序 ; 编译命令:nasm -f win32 -o convert.obj convert.asm ; 链接命令:gcc -m32 -o convert.exe convert.obj ; 运行命令:convert.exe section .data decimal db "请输入一个十进制数:", 0 binary db "二进制数为:", 0 hexadecimal db "十六进制数为:", 0 format db "%d", 0 section .bss input resd 1 output resb 33 section .text global _main extern _printf, _scanf, _exit _main: ; 输出提示信息 push decimal call _printf add esp, 4 ; 输入十进制数 push format push input call _scanf add esp, 8 ; 将输入的十进制数保存到 eax 寄存器中 mov eax, [input] ; 将十进制数转换为二进制数 push eax push output call decimal_to_binary add esp, 8 ; 输出二进制数 push binary push output call _printf add esp, 8 ; 将十进制数转换为十六进制数 push eax push output call decimal_to_hex add esp, 8 ; 输出十六进制数 push hexadecimal push output call _printf add esp, 8 ; 退出程序 push 0 call _exit ; 将十进制数转换为二进制数 ; 参数:eax 中保存十进制数,ebx 中保存输出字符串的地址 ; 返回值:无 decimal_to_binary: xor ecx, ecx ; 清零 ecx 寄存器 mov cl, 32 ; 将 ecx 寄存器的低 8 位设置为 32 convert_loop: shr eax, 1 ; 右移一位 cmp eax, 0 ; 判断是否已经转换完成 jz convert_done adc ecx, 0 ; 将进位标志加到 ecx 的低位 shl ecx, 1 ; 左移一位 jmp convert_loop convert_done: mov esi, ebx ; 将输出字符串的地址保存到 esi 寄存器中 mov ebx, 2 ; 将 ebx 寄存器设置为 2 print_loop: dec ecx ; 将 ecx 寄存器的值减 1 jz print_done ; 如果已经打印完了,跳转到 print_done 标签 test ebx, eax ; 检查 eax 中的最低位是否为 1 jz print_zero ; 如果为 0,跳转到 print_zero 标签 mov byte [esi], '1' ; 如果为 1,将 '1' 写入输出字符串 inc esi ; 将输出字符串的地址加 1 jmp print_next ; 跳转到 print_next 标签 print_zero: mov byte [esi], '0' ; 如果为 0,将 '0' 写入输出字符串 inc esi ; 将输出字符串的地址加 1 print_next: shl ebx, 1 ; 将 ebx 寄存器左移一位 jmp print_loop ; 跳转到 print_loop 标签 print_done: mov byte [esi], 0 ; 将输出字符串的末尾设置为 0 ret ; 将十进制数转换为十六进制数 ; 参数:eax 中保存十进制数,ebx 中保存输出字符串的地址 ; 返回值:无 decimal_to_hex: mov esi, ebx ; 将输出字符串的地址保存到 esi 寄存器中 mov ebx, 16 ; 将 ebx 寄存器设置为 16 print_hex_loop: xor edx, edx ; 清零 edx 寄存器 div ebx ; 将 eax 寄存器的值除以 16,商保存在 eax 中,余数保存在 edx 中 cmp eax, 0 ; 判断是否已经转换完成 jz print_hex_done mov dl, byte [hex_digits + edx] ; 将余数对应的十六进制字符保存到 dl 寄存器中 mov byte [esi], dl ; 将 dl 寄存器中的字符写入输出字符串 inc esi ; 将输出字符串的地址加 1 jmp print_hex_loop print_hex_done: mov dl, byte [hex_digits + edx] ; 将最高位对应的十六进制字符保存到 dl 寄存器中 mov byte [esi], dl ; 将 dl 寄存器中的字符写入输出字符串 inc esi ; 将输出字符串的地址加 1 mov byte [esi], 0 ; 将输出字符串的末尾设置为 0 ret ; 十六进制数字表 hex_digits db "0123456789ABCDEF", 0 ``` 这个程序使用 x86 汇编语言实现了将十进制数转换为二进制数和十六进制数的功能。它在 Windows 平台上编译和链接,并提供了一个简单的命令行界面,允许用户输入一个十进制数并输出其对应的二进制数和十六进制数。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值