1234H存到汇编里地址高位是几
时间: 2023-05-27 19:02:26 浏览: 265
这道题需要注意两点:
1. 在汇编中,地址是以十六进制表示的。
2. 存储器的存储方式是小端存储方式。
在小端存储方式下,一个多字节的数据在存储器中的存放顺序是按照地址递增的方向,每个字节一个字节地存储的。存储时,先存储低字节,再存储高字节。
因此,1234H 在存储器中的存放顺序是 34H 12H。地址高位是指存储器地址的高字节。
假设 1234H 存储在地址为 0000H 的单元中,则它的低字节存储在 0000H,高字节存储在 0001H。因为高字节是 12H,所以地址高位是 0001H。
相关问题
汇编语言循环程序设计能够从键盘接受10个输入数据,并按从大到小的顺序排列后显示出来
好的,我来为您详细解答一下。
首先,我们需要使用汇编语言编写一个循环程序,实现从键盘接受10个输入数据并存储到内存中。
下面是一个简单的示例代码:
```asm
mov bx, 0 ; 初始化计数器
mov cx, 10 ; 设置循环次数
input_loop:
mov ah, 01h ; 设置输入功能号
int 21h ; 调用DOS中断21h,等待输入
sub al, 30h ; 将输入字符转换为数字
mov ah, 0 ; 清空高位
mov [input+bx], al ; 存储到内存中
inc bx ; 计数器加1
loop input_loop ; 循环输入
input:
times 10 db 0 ; 申请10个字节的内存,用于存储输入数据
```
接下来,我们需要编写排序算法,将输入的数据按从大到小的顺序排列。
这里使用冒泡排序算法,代码如下:
```asm
mov bx, 0 ; 初始化计数器
mov cx, 9 ; 设置循环次数,因为每次比较会减少一个数的比较
outer_loop:
mov si, 0 ; 初始化si为0,用于内层循环的计数器
inner_loop:
mov al, [input+si] ; 取出当前位置的值
cmp al, [input+si+1] ; 比较当前值和下一个值的大小
jle skip_swap ; 如果当前值比下一个值大,跳过交换
xchg al, [input+si+1] ; 交换当前值和下一个值
mov [input+si], al ; 存回当前位置
skip_swap:
inc si ; 计数器加1
cmp si, cx ; 判断是否到达循环上限
jle inner_loop ; 如果未到达,继续内层循环
dec cx ; 每次外层循环结束,循环次数减少1
cmp cx, 0 ; 如果循环次数为0,跳出循环
jne outer_loop
```
最后,我们将排好序的数据输出到屏幕上,代码如下:
```asm
mov bx, 0 ; 初始化计数器
mov cx, 10 ; 设置循环次数
output_loop:
mov al, [input+bx] ; 取出当前位置的值
add al, 30h ; 将数字转换为字符
mov ah, 02h ; 设置输出功能号
int 21h ; 调用DOS中断21h,输出字符
inc bx ; 计数器加1
loop output_loop ; 循环输出
mov ah, 4Ch ; 设置功能号,用于程序结束
int 21h ; 调用DOS中断21h,程序结束
```
完整代码如下:
```asm
.model small
.stack 100h
.data
input:
times 10 db 0 ; 申请10个字节的内存,用于存储输入数据
.code
mov bx, 0 ; 初始化计数器
mov cx, 10 ; 设置循环次数
input_loop:
mov ah, 01h ; 设置输入功能号
int 21h ; 调用DOS中断21h,等待输入
sub al, 30h ; 将输入字符转换为数字
mov ah, 0 ; 清空高位
mov [input+bx], al ; 存储到内存中
inc bx ; 计数器加1
loop input_loop ; 循环输入
mov bx, 0 ; 初始化计数器
mov cx, 9 ; 设置循环次数,因为每次比较会减少一个数的比较
outer_loop:
mov si, 0 ; 初始化si为0,用于内层循环的计数器
inner_loop:
mov al, [input+si] ; 取出当前位置的值
cmp al, [input+si+1] ; 比较当前值和下一个值的大小
jle skip_swap ; 如果当前值比下一个值大,跳过交换
xchg al, [input+si+1] ; 交换当前值和下一个值
mov [input+si], al ; 存回当前位置
skip_swap:
inc si ; 计数器加1
cmp si, cx ; 判断是否到达循环上限
jle inner_loop ; 如果未到达,继续内层循环
dec cx ; 每次外层循环结束,循环次数减少1
cmp cx, 0 ; 如果循环次数为0,跳出循环
jne outer_loop
mov bx, 0 ; 初始化计数器
mov cx, 10 ; 设置循环次数
output_loop:
mov al, [input+bx] ; 取出当前位置的值
add al, 30h ; 将数字转换为字符
mov ah, 02h ; 设置输出功能号
int 21h ; 调用DOS中断21h,输出字符
inc bx ; 计数器加1
loop output_loop ; 循环输出
mov ah, 4Ch ; 设置功能号,用于程序结束
int 21h ; 调用DOS中断21h,程序结束
end
```
希望能够对您有所帮助!
帮我修改以下代码,使它的功能不变但是代码不同CRLF MACRO MOV AH,02H MOV DL,0DH INT 21H MOV AH,02H MOV DL,0AH INT 21H ENDM DATAS SEGMENT MES1 DB 'Please input number N','$' MES2 DB 'The result is: $' BUF DW 256 DUP (0) LEN DW 1 CY DW ? DATAS ENDS STACKS SEGMENT DW 32 DUP(?) STACKS ENDS CODES SEGMENT ASSUME CS:CODES,DS:DATAS,SS:STACKS START: MOV AX,DATAS MOV DS,AX MOV AH,9 ;显示提示 LEA DX,MES1 INT 21H CRLF CALL GETNUM ;DX中存放读到的键盘输入值 MOV BP,DX ;N值送BP CMP BP,0 JZ L4 ;BP=0跳转 CMP BP,1 JZ L4 LEA SI,BUF ;SI指向BUF首址 MOV [SI],DX ;缓冲区初始化值为键盘输入N D1: DEC BP ;BP-1=1跳转 CMP BP,1 JZ L5 XOR BX,BX ;BX清0,每次相乘从最低位开始 MOV WORD PTR CY,0 ;同时CY每次要清零 MOV CX,LEN ;CX送循环,判断占了多少个子单元,循环多少次 D2: MOV AX,[SI+BX] MUL BP ADD AX,CY ;加低位进位 JNC D3 ;结果无进位跳转 INC DX ;有进位,积高位加进位 D3: MOV [SI+BX],AX ;存低位 MOV CY,DX ;高位保存在CY,乘高位单元时加上 INC BX INC BX ;一个字长度 LOOP D2 CMP DX,0 ;判断DX两次运算后是否为0 JZ D1 ;DX高位为0跳D1 INC WORD PTR LEN ;DX高位不为0则长度加1,DX送下一个单元 MOV [SI+BX],DX JMP D1 L4: MOV SI,OFFSET BUF ;BUF存1 MOV WORD PTR [SI],1 L5: MOV AH,09H ;显示MES2单元内容 MOV DX,OFFSET MES2 INT 21H MOV CX,LEN MOV BX,CX ;BX=BUF长度 DEC BX ;BX-1 SHL BX,1 L6: MOV AX,[SI+BX] CALL DISPLAY1 ;从高位显示结果 DEC BX DEC BX LOOP L6 MOV AH,4CH INT 21H GETNUM PROC NEAR XOR DX,DX L1: MOV AH,1 INT 21H CMP AL,0DH JZ L2 CMP AL,40H JL L3 ;小于跳转 SUB AL,07H L3: SUB AL,30H MOV CL,04H SHL DX,CL XOR AH,AH ADD DX,AX JMP L1 L2: PUSH DX CRLF POP DX RET GETNUM ENDP DISPLAY1 PROC NEAR PUSH BX PUSH CX PUSH DX PUSH AX MOV AL,AH CALL DISPLAY2 POP AX CALL DISPLAY2 POP DX POP CX POP BX RET DISPLAY1 ENDP DISPLAY2 PROC NEAR ;显示字符(AL) MOV BL,AL MOV DL,BL ;执行MOV AH,02,AX=0200 MOV CL,04 ;执行CALL调用,AL=30H SHR DL,CL CALL DISPLAY3 ;显示高位 MOV DL,BL AND DL,0FH CALL DISPLAY3 ;显示低位 RET DISPLAY2 ENDP DISPLAY3 PROC NEAR ;显示一位(DL=0XH) ADD DL,30H CMP DL,3AH JB A1 ADD DL,07H A1: MOV AH,02H INT 21H RET DISPLAY3 ENDP CODES ENDS END START
以下是修改后的代码,使用了更加规范的汇编语言书写方式,并且添加了注释,但是其功能和原代码相同。请注意,我不知道你的具体要求,所以可能会与你的要求略有不同,但是应该不会影响程序的正常运行。
```
; 定义宏,用于实现输出换行的操作
CRLF MACRO
MOV AH,02H
MOV DL,0DH
INT 21H
MOV AH,02H
MOV DL,0AH
INT 21H
ENDM
; 定义数据段
DATAS SEGMENT
MES1 DB 'Please input number N', 13, 10, '$' ; 提示用户输入N的消息
MES2 DB 'The result is: $' ; 显示结果的消息
BUF DW 256 DUP (0) ; 存放计算结果的缓冲区
LEN DW 1 ; 缓冲区当前长度
CY DW ? ; 存放高位进位的变量
DATAS ENDS
; 定义堆栈段
STACKS SEGMENT
DW 32 DUP(?) ; 定义32个字的堆栈空间
STACKS ENDS
; 定义代码段
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
MOV AX,DATAS
MOV DS,AX
; 提示用户输入N
MOV AH,9
LEA DX,MES1
INT 21H
; 读取用户输入的N
CALL GETNUM
MOV BP,DX ; 将N值送入BP
CMP BP,0 ; 判断BP是否为0
JZ L4 ; 如果BP为0则跳转到L4
CMP BP,1 ; 判断BP是否为1
JZ L4 ; 如果BP为1则跳转到L4
; 将N存入BUF中
LEA SI,BUF
MOV [SI],DX
; 计算结果
D1:
DEC BP ; BP减1
CMP BP,1 ; 判断BP是否为1
JZ L5 ; 如果BP为1则跳转到L5
XOR BX,BX ; BX清0,每次相乘从最低位开始
MOV WORD PTR CY,0 ; 同时CY每次要清零
MOV CX,LEN ; CX送循环,判断占了多少个子单元,循环多少次
D2:
MOV AX,[SI+BX] ; 将BUF中的对应位赋值给AX
MUL BP ; 将AX乘以BP
ADD AX,CY ; 加上高位进位
JNC D3 ; 如果结果无进位则跳转到D3
INC DX ; 有进位,积高位加进位
D3:
MOV [SI+BX],AX ; 将结果存入BUF中
MOV CY,DX ; 将进位保存在CY中,乘高位单元时加上
INC BX
INC BX ; 由于BUF中每个数据占2个字节,所以需要增加2个单位长度
LOOP D2 ; 循环
CMP DX,0 ; 判断DX两次运算后是否为0
JZ D1 ; 如果DX高位为0则跳转到D1
INC WORD PTR LEN ; 如果DX高位不为0则长度加1,DX送下一个单元
MOV [SI+BX],DX
JMP D1
L4:
; 如果N为0或1,则将结果设为1
MOV SI,OFFSET BUF
MOV WORD PTR [SI],1
L5:
; 显示结果
MOV AH,09H
LEA DX,MES2
INT 21H
MOV CX,LEN
MOV BX,CX
DEC BX
SHL BX,1
L6:
MOV AX,[SI+BX]
CALL DISPLAY1
DEC BX
DEC BX
LOOP L6
; 程序结束
MOV AH,4CH
INT 21H
; 读取用户输入的数字
GETNUM PROC NEAR
XOR DX,DX
L1:
MOV AH,1
INT 21H
CMP AL,0DH ; 如果读到回车符,则停止读取
JZ L2
CMP AL,40H ; 如果读取到@字符,则跳过
JL L3
SUB AL,07H
L3:
SUB AL,30H ; 将字符转换为数字
MOV CL,04H
SHL DX,CL ; 将DX左移4位
XOR AH,AH
ADD DX,AX ; 将AX的值加入DX中
JMP L1
L2:
PUSH DX
CRLF ; 输出换行
POP DX
RET
GETNUM ENDP
; 显示单个数字
DISPLAY1 PROC NEAR
PUSH BX
PUSH CX
PUSH DX
PUSH AX
MOV AL,AH
CALL DISPLAY2
POP AX
CALL DISPLAY2
POP DX
POP CX
POP BX
RET
DISPLAY1 ENDP
; 显示字符
DISPLAY2 PROC NEAR
; 将字符转换为ASCII码
MOV BL,AL
MOV DL,BL
SHR DL,4
CALL DISPLAY3 ; 显示高位
MOV DL,BL
AND DL,0FH
CALL DISPLAY3 ; 显示低位
RET
DISPLAY2 ENDP
; 显示单个数字
DISPLAY3 PROC NEAR
ADD DL,30H
CMP DL,3AH
JB A1
ADD DL,07H
A1:
MOV AH,02H
INT 21H
RET
DISPLAY3 ENDP
CODES ENDS
END START
```