汇编语言call的有关问题

请大佬详细讲解一下call word ptr和call dword ptr
主要是执行call word ptr后,它实现的操作push ip,是把哪里的ip扔到堆栈里面去?call的下一条指令的ip么?而且,
call word ptr执行后会跳什么地方去?
还有就是call dword ptr,它实现的是push cs,push ip,是把哪里的cs扔到堆栈0处,把哪里的ip扔到2处?还有执行后会跳到什么地方去?看王爽的《汇编语言》里面的例子感觉不是太qing'chu

1个回答

你看的书都是过时的东西了。16位芯片你倒是去买一片我看看,现在你想买一片32位芯片都困难。
对于32bit系统,从80386DX(本身这款芯片都是1986年出的了,可能比你还大起码15岁)开始,不再使用段内存这种过时的东西。
所以,所有的跳转都是32bit跳转,不再有什么word

qq_33268859
特斯拉的电流原 看这个主要是考研复试的
大约一年之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
汇编语言的Call指令的问题
如图所示,其他几个寄存器的执行结果我都懂,为什么cs的值是0?他的值应该跟ds一样吧?或者原因是ds的值本身就是0?![图片说明](https://img-ask.csdn.net/upload/201705/16/1494940709_926370.png)
汇编call指令自动把函数返回值入栈的的问题
当函数是void为返回类型的时候,call指令的时候还会自动做一次push么?
汇编语言键盘钢琴程序
DATA SEGMENT KEYS DB 'QWERTYU','ASDFGHJ','ZXCVBNM' FREQ DB 131,147,165,175,196,220,247 WELC DB 'Welcome to "Piano of Keyboard"',0DH,0AH,0DH,0AH,'$' EXPL DB 'Explanation:', 0DH,0AH,'Key:QWERTYU-Low Notes 1 2 3 4 5 6 7 ', 0DH,0AH,'Key:ASDFGHJ-Middle Notes 1 2 3 4 5 6 7 ',0DH,0AH,'Key:ZXCVBNM-High Notes 1 2 3 4 5 6 7 ', 0DH,0AH, 'Please Note Your Caps Lock Truned On', 0DH,0AH ESCQ DB 0DH,0AH,'Please play:',0DH,0AH,'(You can Type "ESC" to exit)', 0DH,0AH,0DH,0AH,'$' LAST DB 0DH,0AH,'Welcome again!','$' REMI DB 'Reminder:Please play the Key:"QWERTYU-ASDFGHJ-ZXCVBNM"', 0DH,0AH,'$' DATA ENDS CODE SEGMENT ASSUME CS:CODE DS:DATA START: MOV AX,DATA MOV DS,AX ;初始化数据区 LEA DX,WELC MOV AH,9 INT 21H ;显示提示语句 INPUT: MOV AH,7 INT 21H ;不回显输入键盘的KEY CMP AL,1BH ;判断输入KEY是否为“ESC” JZ EXIT ;若输入KEY为“ESC”则跳转到退出EXIT LEA DI,KEYS MOV CX,21 FIND: CMP AL,[DI] JZ SING ;找到KEY相对应的偏移地址DI则跳转至SING INC DI LOOP FIND ;根据输入KEY的ASCII码找到相对应的偏移地址 LEA DX,REMI MOV AH,9 INT 21H ;输入的KEY不正确,显示提醒请输入正确的KEY JMP INPUT ;不是正确的输入KEY,则跳转至INPUT SING: CALL FIFRE ;进入计算KEY所对应频率值的子程序 CALL SOUND ;进入根据频率值发出音调的子程序 JMP INPUT ;发声完毕后跳转至INPUT EXIT: LEA DX,LAST MOV AH,9 INT 21H ;显示退出时的字幕 MOV AX,4C00H INT 21H ;返回DOS FIFRE PROC ;计算KEY所对应频率值的子程序 MOV DL,1 ;标记频率基准值的倍数值 LEA BX,KEYS SUB DI,BX ;计算偏移地址相对与首地址的值 CMP DI,6 JNA SOU ;属于低音直接跳转至SOU SUB DI,7 ;属于中音,将偏移地址减7 ADD DL,1 ;标记倍数值加倍为2 CMP DI,6 JNA SOU ;属于中音,跳转至SOU SUB DI,7 ;属于高音,将偏移地址再减7 ADD DL,2 ;标记倍数值再加倍为4 SOU: MOV AX,DI ;将被换码给AL LEA BX,FREQ XLAT MUL DL ;频率基准值乘以倍数得到KEY所对应的频率值 MOV BX,AX RET FIFRE ENDP SOUND PROC ;根据频率值发出音调的子程序 MOV AL,0B6H OUT 43H,AL ;向8253的43H写入控制字 MOV DX,12H MOV AX,348CH DIV BX ;计算计数初值N OUT 42H,AL MOV AL,AH OUT 42H,AL ;向通道2端口42H写入计数初值N IN AL,61H OR AL,3 OUT 61H,AL ;打开扬声器 CALL DELAY ;进入延时子程序 IN AL,61H AND AL,0FCH OUT 61H,AL ;关闭扬声器 RET SOUND ENDP DELAY PROC ;延时时间子程序 PUSH BX PUSH CX MOV BX,4000 DY1: MOV CX,0FFFH DY0: LOOP DY0 DEC BX JNZ DY1 ;利用LOOP循环和跳转指令进行双循环 POP CX POP BX RET DELAY ENDP CODE ENDS END START 在DOSBOX里运行时无论按哪个键它都没办法弹![图片说明](https://img-ask.csdn.net/upload/201601/13/1452659977_585192.png) 一直重复显示着那句话!! 求助呀!
紧急求各位大神帮帮弄下汇编语言的
DATAS SEGMENT BUFFER DB 20 DUP(0) BUFFER1 DB 20 DUP(0) MSG1 DB "Please input you want choose number: $" MSG2 DB "1: eg:A to a exchange : Uppercase to lowercase $" MSG3 DB "2: eg:a to A exchange : Lowercase to Uppercase $" MSG4 DB "3: eg:1111 to f : Binary to Hexadecimal $" MSG5 DB "4: eg:f to 1111 : Hexadecimal to Binary $" MSG6 DB "5: eg:f to 15 : Hexadecimal to Decimal $" MSG7 DB "PLEASE INPUT SOME ALPHABET:$" MSG8 DB "PLEASE INPUT SOME BINARY NUMBER:$" MSG9 DB "PLEASE INPUT SOME HEX NUMBER:$" DATAS ENDS STACKS SEGMENT STACKS ENDS CODES SEGMENT ASSUME CS:CODES,DS:DATAS,SS:STACKS START: MOV AX,DATAS MOV DS,AX P: CALL MENU ;子程序调用 CMP AL,'1' JZ A ; 若 AL=1,则转到A CMP AL,'2' JZ B ; 若AL=2,则转到B CMP AL,'3' JZ CA CMP AL,'4' JNZ LO JMP D LO: CMP AL,'5' JNZ EXIT1 JMP asd EXIT1:JMP EXIT A: CALL CLEAR ;子程序调用 MOV AH,02 ;设置光标位置 MOV DH,3 MOV DL,2 INT 10H ;中断指令 MOV SI,OFFSET MSG7 ;取MSG7的地址指针送入SI MOV DX,SI MOV AH,09 ;;显示一个字符串 INT 21H LEA SI,BUFFER ;取BUFFER的有效地址给SI S: MOV AH,01 ;;输入一个字符 INT 21H MOV [SI],AL INC SI CMP AL,0DH ;;回车 JNZ S ; ;若不输入回车,则继续执行S CALL CRLF MOV AH,02 ; ;设置光标位置 MOV DH,5 MOV DL,28 INT 10H LEA SI,BUFFER Q: MOV AL,[SI] CMP AL,'a' JNB E ; ;若AL的内容低于‘A’则转到E ADD AL,20H ; ;AL加上20H,大写字母转换为小写字母 E: MOV DL,AL MOV AH,02 ; ;显示一个字符 INT 21H INC SI MOV AL,[SI] CMP AL,0DH JNZ Q ; ;若不输入回车的话,则继续执行Q MOV AH,01 INT 21H CMP AL,0DH JZ P ; ;若输入回车,则返回P JMP EXIT B: CALL CLEAR ;调用子程序 MOV AH,02 MOV DH,3 MOV DL,2 INT 10H MOV SI,OFFSET MSG7 MOV DX,SI MOV AH,09 ; ;显示一个字符串 INT 21H LEA SI,BUFFER M: MOV AH,01 INT 21H MOV [SI],AL INC SI CMP AL,0DH JNZ M ; ;若不输入回车,则继续执行M CALL CRLF MOV AH,02 ; ;设置光标位置 MOV DH,5 MOV DL,28 INT 10H LEA SI,BUFFER I: MOV AL,[SI] CMP AL,5AH JNGE X ; ;若AL的内容低于‘Z’,则转到X SUB AL,20H ; ;小写字母转换为大写字母 X: MOV DL,AL MOV AH,02 INT 21H INC SI MOV AL,[SI] CMP AL,0DH JNZ I MOV AH,01 ; ;输入一个字符 INT 21H CMP AL,0DH JNZ EXIT0 ; ;若不输入回车,则转到EXIT0出 JMP P EXIT0:JMP EXIT CA: CALL CLEAR MOV AH,02 ;;设置光标位置 MOV DH,3 MOV DL,2 INT 10H MOV SI,OFFSET MSG8 MOV DX,SI MOV AH,09 INT 21H LEA SI,BUFFER NAA: MOV AH,01 INT 21H MOV [SI],AL INC SI CMP AL,0DH JNZ NAA CALL CRLF LEA DI,BUFFER MOV AH,02 MOV DH,5 MOV DL,28 INT 10H Y: MOV AL,[DI] SUB AL,30H ;;将ASCII码转换为二进制 MOV BL,8D MUL BL ADD AL,30H MOV DL,0 ADD DL,AL INC DI MOV AL,[DI] SUB AL,30H MOV BL, 4D MUL BL ADD DL,AL INC DI MOV AL,[DI] SUB AL,30H MOV BL,2D MUL BL ADD DL,AL INC DI MOV AL,[DI] SUB AL,30H MOV BL,1D MUL BL ADD DL,AL CMP DL,'9' JNG T ADD DL,'A'-':' T: MOV AH,02 INT 21H INC DI MOV AL,[DI] CMP AL,0DH JNZ Y MOV AH,01 INT 21H CMP AL,0DH JNZ EXIT JMP P D: CALL CLEAR MOV AH,02 MOV DH,3 MOV DL,2 INT 10H MOV SI,OFFSET MSG9 MOV DX,SI MOV AH,09 INT 21H LEA SI,BUFFER asd: CALL CLEAR MOV AH,02 MOV DH,3 MOV DL,2 INT 10H MOV SI,OFFSET MSG9 MOV DX,SI ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; MOV AH,09 INT 21H LEA SI,BUFFER FF: MOV AH,01 INT 21H MOV [SI],AL INC SI CMP AL,0DH JNZ FF CALL CRLF LEA SI,BUFFER MOV DI,OFFSET BUFFER1 RE: MOV AL,[SI] CMP AL,'9' JNG Z SUB AL,'A'-':' Z: SUB AL,30H MOV CX,4 ADD DI,4 YU: CBW MOV BL,2D DIV BL MOV [DI],AH PUSH AX ADD AH,30H ; ; 二进制转化为ASCII码 POP AX DEC DI LOOP YU ADD DI,4 INC SI MOV AL,[SI] CMP AL,0DH JNZ RE INC DI MOV AL,'$' MOV [DI],AL CALL CRLF MOV SI,OFFSET BUFFER1+1 MOV AL,[SI] RT: ADD AL,30H MOV DL,AL MOV AH,02 INT 21H INC SI MOV AL,[SI] CMP AL,'$' JNZ RT MOV AH,01 INT 21H CMP AL,0DH JNZ EXIT JMP P EXIT: MOV AH,4CH INT 21H ;返回DOS系统 MENU PROC NEAR CALL CLEAR ;调用子程序 MOV AH,02 ;设置光标位置 MOV DH,5 ;第5行 MOV DL,25 ;第25列 INT 10H LEA SI,MSG2 MOV DX,SI MOV AH,09 ;显示MSG2的内容 INT 21H ;输出MSG2字符串 MOV AH,02 ;至光标位置 MOV DH,7 ;第7行 MOV DL,25 ;第25列 INT 10H LEA SI,MSG3 ;取MSG3的有效地址 MOV DX,SI MOV AH,09 INT 21H ;输出MSG3字符串 MOV AH,02 MOV DH,9 ;第9行 MOV DL,25 ;第25列 INT 10H LEA SI,MSG4 ;取MSG4的有效地址 MOV DX,SI MOV AH,09 INT 21H ;输出MSG4字符串 MOV AH,02 MOV DH,11 ;第11行 MOV DL,25 ;第25列 INT 10H LEA SI,MSG5 MOV DX,SI MOV AH,09 INT 21H ;输出MSG5字符串 MOV AH,02 ;至光标位置 MOV DH,13 ;第15列 MOV DL,25 ;第17列 INT 10H LEA SI,MSG6 MOV DX,SI MOV AH,09 INT 21H ;输出MSG6字符串 MOV AH,02 ;至光标位置 MOV DH,19 ;第19列 MOV DL,25 ;第25列 INT 10H LEA SI,MSG1 MOV DX,SI MOV AH,09 INT 21H ;输出MSG1字符串 MOV AH,01 ;键盘输入 INT 21H RET ;返回 MENU ENDP CLEAR PROC NEAR PUSH AX PUSH BX PUSH CX PUSH DX PUSH SI PUSH DI MOV AH,07 ;屏幕初始化或下卷 MOV AL,25 ;下卷行数 MOV BH,70H ;卷入行属性 MOV CH,0 ;左上角行号 MOV CL,0 ;左上角列号 MOV DH,24 ;右下角行号 MOV DL,79 ;右下角列号 INT 10H POP DI POP SI POP DX POP CX POP BX POP AX RET CLEAR ENDP CRLF PROC NEAR PUSH AX PUSH BX PUSH CX PUSH DX PUSH SI PUSH DI MOV DL,0DH ;输出回车 MOV AH,02 INT 21H MOV DL,0AH ;输出换行 MOV AH,02 INT 21H POP DI POP SI POP DX POP CX POP BX POP AX RET CRLF ENDP CODES ENDS ;代码段结束 END START ;程序结束
如何在汇编中call scanf_s 输入一个字符 求求求!
这是在汇编中call scanf_s 输入Integer 的部分代码 ``` char format[]="%d"; //format string for the scanf function int first; _asm{ lea eax,first push eax lea eax,format; 读取第一个number push eax call scanf_s add esp,8 mov eax,dword ptr [first] push eax lea eax,format push eax call printf add esp,8 } ```
求大神帮帮添加一个十六进制转十进制的功能在number 5这个地方汇编语言
DATAS SEGMENT BUFFER DB 20 DUP(0) BUFFER1 DB 20 DUP(0) MSG1 DB "Please input you want choose number: $" MSG2 DB "1: eg:A to a exchange : Uppercase to lowercase $" MSG3 DB "2: eg:a to A exchange : Lowercase to Uppercase $" MSG4 DB "3: eg:1111 to f : Binary to Hexadecimal $" MSG5 DB "4: eg:f to 1111 : Hexadecimal to Binary $" MSG6 DB "5: eg:f to 15 : Hexadecimal to Decimal $" MSG7 DB "PLEASE INPUT SOME ALPHABET:$" MSG8 DB "PLEASE INPUT SOME BINARY NUMBER:$" MSG9 DB "PLEASE INPUT SOME HEX NUMBER:$" DATAS ENDS STACKS SEGMENT STACKS ENDS CODES SEGMENT ASSUME CS:CODES,DS:DATAS,SS:STACKS START: MOV AX,DATAS MOV DS,AX P: CALL MENU ;子程序调用 CMP AL,'1' JZ A ; 若 AL=1,则转到A CMP AL,'2' JZ B ; 若AL=2,则转到B CMP AL,'3' JZ CA CMP AL,'4' JNZ LO JMP D LO: CMP AL,'5' JNZ EXIT1 JMP asd EXIT1:JMP EXIT A: CALL CLEAR ;子程序调用 MOV AH,02 ;设置光标位置 MOV DH,3 MOV DL,2 INT 10H ;中断指令 MOV SI,OFFSET MSG7 ;取MSG7的地址指针送入SI MOV DX,SI MOV AH,09 ;;显示一个字符串 INT 21H LEA SI,BUFFER ;取BUFFER的有效地址给SI S: MOV AH,01 ;;输入一个字符 INT 21H MOV [SI],AL INC SI CMP AL,0DH ;;回车 JNZ S ; ;若不输入回车,则继续执行S CALL CRLF MOV AH,02 ; ;设置光标位置 MOV DH,5 MOV DL,28 INT 10H LEA SI,BUFFER Q: MOV AL,[SI] CMP AL,'a' JNB E ; ;若AL的内容低于‘A’则转到E ADD AL,20H ; ;AL加上20H,大写字母转换为小写字母 E: MOV DL,AL MOV AH,02 ; ;显示一个字符 INT 21H INC SI MOV AL,[SI] CMP AL,0DH JNZ Q ; ;若不输入回车的话,则继续执行Q MOV AH,01 INT 21H CMP AL,0DH JZ P ; ;若输入回车,则返回P JMP EXIT R: MOV AX,47EH MOV CX,0 MOV BX,10 DISP1: MOV DX,0 DIV BX PUSH DX INC CX OR AX,AX JNE DISP1 DISP2: MOV AH,2 POP DX ADD DL,30H INT 21H LOOP DISP2 B: CALL CLEAR ;调用子程序 MOV AH,02 MOV DH,3 MOV DL,2 INT 10H MOV SI,OFFSET MSG7 MOV DX,SI MOV AH,09 ; ;显示一个字符串 INT 21H LEA SI,BUFFER M: MOV AH,01 INT 21H MOV [SI],AL INC SI CMP AL,0DH JNZ M ; ;若不输入回车,则继续执行M CALL CRLF MOV AH,02 ; ;设置光标位置 MOV DH,5 MOV DL,28 INT 10H LEA SI,BUFFER I: MOV AL,[SI] CMP AL,5AH JNGE X ; ;若AL的内容低于‘Z’,则转到X SUB AL,20H ; ;小写字母转换为大写字母 X: MOV DL,AL MOV AH,02 INT 21H INC SI MOV AL,[SI] CMP AL,0DH JNZ I MOV AH,01 ; ;输入一个字符 INT 21H CMP AL,0DH JNZ EXIT0 ; ;若不输入回车,则转到EXIT0出 JMP P EXIT0:JMP EXIT CA: CALL CLEAR MOV AH,02 ;;设置光标位置 MOV DH,3 MOV DL,2 INT 10H MOV SI,OFFSET MSG8 MOV DX,SI MOV AH,09 INT 21H LEA SI,BUFFER NAA: MOV AH,01 INT 21H MOV [SI],AL INC SI CMP AL,0DH JNZ NAA CALL CRLF LEA DI,BUFFER MOV AH,02 MOV DH,5 MOV DL,28 INT 10H Y: MOV AL,[DI] SUB AL,30H ;;将ASCII码转换为二进制 MOV BL,8D MUL BL ADD AL,30H MOV DL,0 ADD DL,AL INC DI MOV AL,[DI] SUB AL,30H MOV BL, 4D MUL BL ADD DL,AL INC DI MOV AL,[DI] SUB AL,30H MOV BL,2D MUL BL ADD DL,AL INC DI MOV AL,[DI] SUB AL,30H MOV BL,1D MUL BL ADD DL,AL CMP DL,'9' JNG T ADD DL,'A'-':' T: MOV AH,02 INT 21H INC DI MOV AL,[DI] CMP AL,0DH JNZ Y MOV AH,01 INT 21H CMP AL,0DH JNZ EXIT JMP P D: CALL CLEAR MOV AH,02 MOV DH,3 MOV DL,2 INT 10H MOV SI,OFFSET MSG9 MOV DX,SI MOV AH,09 INT 21H LEA SI,BUFFER asd: CALL CLEAR;;;;;;;;;;;;;;;;;;;;number5这个地方 MOV AH,02 MOV DH,3 MOV DL,2 INT 10H MOV SI,OFFSET MSG9 MOV DX,SI MOV AH,09 INT 21H LEA SI,BUFFER FF: MOV AH,01 INT 21H MOV [SI],AL INC SI CMP AL,0DH JNZ FF CALL CRLF LEA SI,BUFFER MOV DI,OFFSET BUFFER1 RE: MOV AL,[SI] CMP AL,'9' JNG Z SUB AL,'A'-':' Z: SUB AL,30H MOV CX,4 ADD DI,4 YU: CBW MOV BL,2D DIV BL MOV [DI],AH PUSH AX ADD AH,30H ; ; 二进制转化为ASCII码 POP AX DEC DI LOOP YU ADD DI,4 INC SI MOV AL,[SI] CMP AL,0DH JNZ RE INC DI MOV AL,'$' MOV [DI],AL CALL CRLF MOV SI,OFFSET BUFFER1+1 MOV AL,[SI] RT: ADD AL,30H MOV DL,AL MOV AH,02 INT 21H INC SI MOV AL,[SI] CMP AL,'$' JNZ RT MOV AH,01 INT 21H CMP AL,0DH JNZ EXIT JMP P EXIT: MOV AH,4CH INT 21H ;返回DOS系统 MENU PROC NEAR CALL CLEAR ;调用子程序 MOV AH,02 ;设置光标位置 MOV DH,5 ;第5行 MOV DL,25 ;第25列 INT 10H LEA SI,MSG2 MOV DX,SI MOV AH,09 ;显示MSG2的内容 INT 21H ;输出MSG2字符串 MOV AH,02 ;至光标位置 MOV DH,7 ;第7行 MOV DL,25 ;第25列 INT 10H LEA SI,MSG3 ;取MSG3的有效地址 MOV DX,SI MOV AH,09 INT 21H ;输出MSG3字符串 MOV AH,02 MOV DH,9 ;第9行 MOV DL,25 ;第25列 INT 10H LEA SI,MSG4 ;取MSG4的有效地址 MOV DX,SI MOV AH,09 INT 21H ;输出MSG4字符串 MOV AH,02 MOV DH,11 ;第11行 MOV DL,25 ;第25列 INT 10H LEA SI,MSG5 MOV DX,SI MOV AH,09 INT 21H ;输出MSG5字符串 MOV AH,02 ;至光标位置 MOV DH,13 ;第15列 MOV DL,25 ;第17列 INT 10H LEA SI,MSG6 MOV DX,SI MOV AH,09 INT 21H ;输出MSG6字符串 MOV AH,02 ;至光标位置 MOV DH,19 ;第19列 MOV DL,25 ;第25列 INT 10H LEA SI,MSG1 MOV DX,SI MOV AH,09 INT 21H ;输出MSG1字符串 MOV AH,01 ;键盘输入 INT 21H RET ;返回 MENU ENDP CLEAR PROC NEAR PUSH AX PUSH BX PUSH CX PUSH DX PUSH SI PUSH DI MOV AH,07 ;屏幕初始化或下卷 MOV AL,25 ;下卷行数 MOV BH,70H ;卷入行属性 MOV CH,0 ;左上角行号 MOV CL,0 ;左上角列号 MOV DH,24 ;右下角行号 MOV DL,79 ;右下角列号 INT 10H POP DI POP SI POP DX POP CX POP BX POP AX RET CLEAR ENDP CRLF PROC NEAR PUSH AX PUSH BX PUSH CX PUSH DX PUSH SI PUSH DI MOV DL,0DH ;输出回车 MOV AH,02 INT 21H MOV DL,0AH ;输出换行 MOV AH,02 INT 21H POP DI POP SI POP DX POP CX POP BX POP AX RET CRLF ENDP CODES ENDS ;代码段结束 END START ;程序结束
关于一段汇编程序的问题(《汇编语言第三版》王爽著中实验十第三小题数值显示的程序)
为了实现题目要求的功能编写了一段汇编代码,发现直接运行该代码生成的exe文件会陷入死循环无法结束。而如果debug单步调试的话能够正常跳转到int 21h程序结束部分,请问直接运行exe为什么会陷入死循环? (如果没有该教材的话可以看链接视频中关于这个问题的讲解https://www.bilibili.com/video/av28132657?p=53) ``` assume cs:code data segment db 16 dup (0) data ends code segment start:mov ax,12666 mov bx,data mov ds,bx mov si,0 call dtoc mov dh,8 mov dl,3 mov cl,2 call show_str mov ax,4c00h int 21h show_str: mov si,bx mov bx,0 mov bl,160 mov al,dh mul bl mov bx,ax mov al,dl mul cl add bl,al mov ax,0b800h mov es,ax mov cx,si dec si s0: mov al,ds:[si] add al,30h mov es:[bx],al mov byte ptr es:[bx+1],24h dec si add bx,2 loop s0 ret dtoc:mov bx,0 s:mov cx,10d div cx mov byte ptr ds:[bx],dl inc bx mov cx,ax jcxz ok mov dx,0 jmp short s ok: ret code ends end start ```
linux汇编语言的语句有疑问
看了函数指针数组,汇编出来的代码有call *%eax这样一个语句,不明白,求解答
汇编语言中出现 ATTEMPT TO ACCESS DATA OUTSIDE SEGMENT BOUNDS的link错误,求大神帮助
本人初学汇编语言,有很多错误,该问题是讲al中的二进制数转化成16进制数并输出,可是出现了错误说我在范围外调用data segment 代码如下: DATA SEGMENT RESULT DB 2 DUP(?) DATA ENDS STACK SEGMENT DB 200(?) CODE SEGMENT MAIN PROC FAR ASSUME CS:CODE, DS:DATA START: PUSH DS SUB AX,AX PUSH AX MOV AX,DATA MOV DS,AX MOV BL,0FH AND BL,AL PUSH BL CALL TRANSFER MOV AH,BL MOV BL,11110000B AND BL,AL MOV CL,4 SHR BL,CL PUSH BL CALL TRANSFER SHL BL,CL MOV RESULT,AH MOV RESULT+1,BL MOV AH,09H MOV DX,RESULT INT 21H RET MAIN ENDP TRANSFER: POP BL PUSH AX PUSH CX PUSH DX CMP BL,0AH JB PROCESS1 JNB PROCESS2 PROCESS1: ADD BL,30H PUSH BL JMP QUIT PROCESS2: ADD BL,37H POP AX POP CX POP DX PUSH BL QUIT: RET END TRANSFER CODE EDNS END START 报错信息如下: fatal error : attemp to access data outside the segment
{汇编语言} 在使用栈时出现的一个小问题
我想把寄存器中的数据保存到栈里,为什么使用的时候结果就会出问题,但如果直接在程序中打出来结果就是正确的 call enter_stack ======================= call out_stack enter_stack:push di push si push cx ret out_stack :pop cx pop si pop di ret 整个代码: assume cs:code data segment ;0123456789ABCDEF 07H黑底白字 db 'conversation' data ends stack segment db 16 dup(0) stack ends code segment start :mov ax,data mov ds,ax mov ax,stack mov ss,ax mov sp,16 mov ax,0B800H mov es,ax mov di,12*80*2+40*2-8*2 mov cx,12 mov si,0 push di push si push cx call show ;显示小写字符 pop cx pop si pop di call cube ;原字符变大写 mov di,13*80*2+40*2-8*2 mov cx,12 mov si,0 call show ;显示大写字符 mov ax,4c00h int 21h show: mov dl,ds:[si] mov dh,07H ;白底黑字 mov es:[di],dx inc si add di,2 loop show ret cube: and byte ptr ds:[si],11011111b inc si loop cube ret enter_stack:push di push si push cx ret out_stack:pop cx pop si pop di ret code ends end start 直接用push和pop就没有问题,但用call enter__stack和out__stack就有问题了,想问为什么会这样?
汇编语言,随机输入字符串分类输出并统计个数。下面代码只能统计个数,怎么把字符分类输出?
DATAS SEGMENT letter db 0 digit db 0 other db 0 str db 80,?,80 dup(?) str2 db 'letter:$' str3 db 'digit:$' str4 db 'other:$' DATAS ENDS CODES SEGMENT ASSUME CS:CODES,DS:DATAS,SS:STACKS START: MOV AX,DATAS MOV DS,AX lea dx,str mov ah,0ah int 21h mov ch,0 mov cl,80 L1:mov ah,1 int 21h cmp al,0dh jz over cmp al,'0' jb others cmp al,'9' ja L2 jmp digits L2:cmp al,'A' jb others cmp al,'Z' ja L3 jmp letters L3:cmp al,'a' jb others cmp al,'z' ja others jmp letters letters: inc letter jmp over1 digits: inc digit jmp over1 others: inc other jmp over over1: loop L1 over: call endline lea dx,str2 mov ah,9 int 21h sub ax,ax mov al,letter call display call endline lea dx,str3 mov ah,9 int 21h sub ax,ax mov al,digit call display call endline lea dx,str4 mov ah,9 int 21h sub ax,ax mov al,other call display MOV AH,4CH INT 21H endline proc near mov ah,2 mov dl,0ah int 21h mov ah,2 mov dl,0dh int 21h ret endline endp display proc near mov dl,al add dl,30h mov ah,2 int 21h ret display endp CODES ENDS END START
汇编语言输入三个数,求其阶乘,并将结果排序输出
data segment result dw ? msg0 db 'Input a digit (0-8):$' msg1 db 'Result:$' data ends code segment main proc far assume cs:code,ds:data start: push ds sub ax,ax push ax mov ax,data mov ds,ax mov dx,offset msg0 mov ah,09h int 21h call getnum call fact mov dx,offset msg1 mov ah,09h int 21h call output ret main endp getnum proc near xor bx,bx newchar: mov ah,1 int 21h sub al,30h jl exit cmp al,9d jg exit cbw xchg ax,bx mov cx,10d mul cx xchg ax,bx add bx,ax mov result,bx jmp newchar exit: ret getnum endp fact proc near mov cx,result xor ax,ax mov ax,1 loop1: cmp cx,1 jl fa_exit mul cx loop loop1 fa_exit: mov result,ax ret fact endp output proc near xor cx,cx xor dx,dx mov bx,10d mov ax,result next_num: cmp ax,0d; je op_exit; div bx inc cx add dx,30h push dx xor dx,dx jmp next_num op_exit: pop dx mov ah,2 int 21h loop op_exit ret output endp code ends end start 求阶乘的代码在这
汇编语言 王爽老师 课程设计1
assume cs:code 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' dd 16,22,382,1356,2390,8000,16000,24486,50065,97479,140417,197514 dd 345980,590827,803530,1183000,1843000,2759000,3753000,4649000,5937000 dw 3,7,9,13,28,38,130,220,476,778,1001,1442,2258,2793,4037,5635,8226 dw 11542,14430,15257,17800 data ends temp segment db 10 dup(0) temp ends stack segment db 64 dup(0) stack ends code segment start: mov ax,stack mov ss,ax mov sp,64 mov ax,data mov es,ax mov ax,temp mov ds,ax mov si,0 mov bp,0 mov bx,0 mov di,0 mov cx,21 s: push cx mov ax,es:[bx] mov ds:[si],ax mov ax,es:[bx+2] mov ds:[si+2],ax mov byte ptr ds:[si+4],0 mov dh,24 sub dh,cl mov dl,3 mov cl,2 call show_str push dx mov ax,es:[84+bp] mov dx,es:[84+bp+2] call dtoc pop dx add dl,10 call show_str push dx mov ax,es:[168+di] mov dx,0 call dtoc pop dx add dl,10 call show_str push dx push cx mov ax,es:[84+bp] mov dx,es:[84+bp+2] mov cx,es:[168+di] call divdw call dtoc pop cx pop dx add dl,10 call show_str add bx,4 add bp,4 add di,2 pop cx loop s mov ax,4c00h int 21h show_str: push ax push bx push cx push si push di push es mov bl,cl mov bh,0 mov ax,0b800h mov es,ax mov al,0a0h mov ah,0 mul dh mov di,ax mov al,2h mov ah,0 mul dl add di,ax write_str: mov ch,0 mov cl,[si] jcxz ok mov es:[di],cl mov es:[di+1],bl inc si add di,2 jmp short write_str ok: pop es pop di pop si pop cx pop bx pop ax ret divdw: push bx push ax mov ax,dx mov dx,0 div cx mov bx,ax pop ax div cx mov cx,dx mov dx,bx pop bx ret dtoc: push bx push cx push si mov cx,0 push cx mov bx,1 div_continue: mov cx,10 call divdw add cx,30H push cx inc bx mov cx,dx jcxz hzero jmp short div_continue hzero: mov cx,dx jcxz lzero jmp short div_continue lzero: mov cx,bx s_move: pop bx mov ds:[si],bx inc si loop s_move pop si pop cx pop bx ret code ends end start 不知是哪里错了,请大神看看,得出的图不对,,,
汇编语言几种除法的区别
idiv 和fdiv有什么区别 1820: i = i / 0.0; //为什么改成 i = i / 0.0;就不报错? 004015DF fild dword ptr [ebp-4 004015E2 fdiv qword ptr [__real@8@00000000000000000000 (0046fce8) 004015E8 call __ftol (00401c80 004015ED mov dword ptr [ebp-4],eax -------------------------------------------------------------------------------- 1820: i = i / 0; //为什么改成 i = i / 0.0;就不报错? 004015DF mov eax,dword ptr [ebp-4] 004015E2 cdq 004015E3 xor ecx,ecx 004015E5 idiv eax,ecx 004015E7 mov dword ptr [ebp-4],eax
微机原理汇编语言教材示例程序错误
教材ibm pc示例程序F8-2程序报错 报错内容:(50) illegal instruction: MOVZX BX,ACTULEN or wrong parameters. 报错部分代码: MOVZX BX,ACTULEN;用07H替换0DH 试过将MOVZX改为MOV仍然报错 求大佬指点解决办法!!! 所用的编译器:emu8086 version 4.08 完整程序代码如下: ``` .MODEL SMALL .STACK 64 .DATA PARLIST LABEL BYTE;名字的参数表 MAXNLEN DB 20;名字的最大长度 ACTULEN DB 10 DUP(0);输入的字符数 KBNAME DB 21 DUP('');存入名字 PROMPT DB 'Name?','$' ; .CODE ;.386;为MOVZX指令指定处理器 A10MAIN PROC FAR MOV AX,@DATA;初始化段寄存器 MOV DS,AX MOV ES,AX CALL Q10CLEAR;清屏 A20: MOV DX,0000;设置光标为00,00 CALL Q20CURSOR CALL B10INPUT;用于输入名字 CALL Q10CLEAR;清屏 CMP ACTULEN,00;输入名字? JE A30;否,则退出 CALL C10CENTER;设置响铃和'$' CALL D10DISPLY;并在中央显示名字 JMP A20;重复 A30: MOV AX,4C00H;处理结束 INT 21H A10MAIN ENDP ;显示提示符并接收输入的名字: ;--------------------------- B10INPUT PROC NEAR PUSH AX;保存要使用的 PUSH DX;寄存器 MOV AH,09H;请求显示用户提示符 LEA DX,PROMPT INT 21H MOV AH,0AH;请求键盘输入 LEA DX,PARLIST INT 21H POP DX;恢复寄存器 POP AX RET B10INPUT ENDP ;设置响铃符和'$'定界符 ;在屏幕中央设置光标: ;---------------------- C10CENTER PROC NEAR;使用BX和DX MOVZX BX,ACTULEN;用07H替换0DH **//此处报错** MOV KBNAME[BX],07 MOV KBNAME[BX+1],'$';设置显示界定符 MOV DL,ACTULEN;定位中心位置的列 SHR DL,1;长度除2 NEG DL ADD DL,40 MOV DH,12 CALL Q20CURSOR C10CENTER ENDP ;显示中心位置的名字: ;------------------- D10DISPLY PROC NEAR;使用AH和DX MOV AH,09H LEA DX,KBNAME;显示名字 INT 21H RET D10DISPLY ENDP ;清屏并设置属性: ;--------------- Q10CLEAR PROC NEAR PUSHA;保存通用寄存器 MOV AX,0600H;请求卷屏 MOV BH,30;彩色属性 MOV CX,0000;从00,00 MOV DX,184FH;到24,79 POPA;恢复通用寄存器 INT 10H RET Q10CLEAR ENDP ;设置光标的行列: ;--------------- ;DX已输入数据 Q20CURSOR PROC NEAR;使用AH和BH MOV AH,02H;请求设置光标 MOV BH,00;页号0 INT 10H RET Q20CURSOR ENDP END A10MAIN ```
汇编语言:org 07c00h的问题
我在看《自己动手写操作系统》的时候,代码1.1boot.asm程序是这样的: 1 org 07c00h ; 告诉编译器程序加载到7c00处 2 mov ax, cs 3 mov ds, ax 4 mov es, ax 5 call DispStr ;调用显示字符串例程 ... rom-bios不是直接跳转到07c00处执行了吗,为什么还要org 07c00h这一句语句呢?
汇编语言的代码在dosboxs上出了点问题,有大神帮忙解决一下吗?
初学汇编,小白一枚,不知道错在哪里了,求大神带飞,代码是在源码中国下载的,在dosbox显示这样, ``` ;*********************************************************************************************************************** ;程序功能: ;完成小车的自动和手动沿轨道行驶的过程,并具有计时功能 ;*********************************************************************************************************************** ;运行说明: ;程序运行之后,即显示出轨道和小车; ;按键‘a’或‘m’选择自动还是手动(a为自动,m为手动),按‘s’键启动小车; ;手动时,按方向键控制小车方向,撞到轨道时,小车会停止并闪动; ;小车到达终点后会自动停车,之后按‘r’键可使小车回到起点,然后重新选择小车的运行得方式; ;小车行驶过程中,计时器计时,到达终点则停止计时; ;手动时,按‘t’暂停,‘c’键继续,此间计时不停止; ;小车回到起点位置后,按下‘s’键计时清零,并重新进行下一次的计时; ;小车处于未选定模式和手动运行时可按Esc键退出运行。 ;*********************************************************************************************************************** stack segment 'stack' db 256 dup(0) stack ends data segment count dw 0 sec dw 0 min dw 0 save_lc dw 2 dup(?) car db 0,7,0,0,0,0,0,0,7,0 ;车的图案,10行10列 db 7,0,7,0,0,0,0,7,0,7 db 0,7,9,9,9,9,9,9,7,0 db 0,0,9,0,0,0,0,9,0,0 db 0,0,9,0,0,0,0,9,0,0 db 0,0,9,0,0,0,0,9,0,0 db 0,0,9,0,0,0,0,9,0,0 db 0,7,9,9,9,9,9,9,7,0 db 7,0,7,0,0,0,0,7,0,7 db 0,7,0,0,0,0,0,0,7,0 x dw 180 ;起始位置 y dw 83 start_flag_1 db 0 ;启动标志1 start_flag_2 db 0 ;启动标志2 direc_flag db 0 ;方向标志 touch_flag db 0 ;触轨标志 arrive_flag db 0 ;到达标志 turn_x1 dw 138 ;拐弯点 turn_y1 dw 28 turn_x2 dw 203 turn_y2 dw 133 turn_x3 dw 135 es_save dw 0 ;用于保存图形缓冲区的首地址 mode db ? ;用于保存显示之前显示器的模式 x1 dw ? ;9型轨道的坐标 y1 dw ? x2 dw ? y2 dw ? x3 dw ? y3 dw ? x4 dw ? x_d dw 15 ;轨道的宽度 data ends code segment ;段设置 assume cs:code,ds:data start: mov ax,data mov ds,ax mov es,ax mov ax,0a000h ;图形缓冲区的首地址 mov es,ax mov es_save,ax ;把图形缓冲区的首地址保存在es_save mov ah,0fh int 10h ;获取显示器显示图形之前的显示模式 mov mode,al ;把显示模式保存在mode中 mov ah,35h mov al,1ch int 21h ;取中段号为1ch(定时中断)的中段向量(即中断程序的入口地址),并把它放在ES:BX中 mov save_lc,bx mov save_lc+2,es ;保存中断向量 push ds ;保存ds mov dx,seg clint ;定时中断服务程序的段地址 mov ds,dx mov dx,offset clint ;定时中断的中断服务程序的偏移地址 mov al,1ch mov ah,25h int 21h ;设置中断向量,入口:DS:DX=中断向量,al=中断类型号。 ;即把定时中断的中断服务程序的入口地址放在4*n(其中n为中断类型号)中 pop ds ;ds出栈 in al,21h ;允许键盘和定时器中断 and al,11111100b out 21h,al sti ;开中断 mov ax,13h int 10h ;设置显示器的模式为13h,320×200,256色 call guidao_9 ;画轨道 call picture ;显示小车 input: mov ah,0 int 16h ;等待按键输入 cmp ax,011bh ;Esc键退出 jz b4 cmp ax,326dh ;选m,则为手动 jne b1 call xiaoche_shou jmp b2 b1: cmp ax,1e61h ;选a,则为自动 jne input ;都没有选,则重新选择输入 call xiaoche_move b2: mov ah,0 ;等待按下r键 int 16h cmp ax,1372h ;r键的扫描码 jnz b2 ;不是r键,则等待至按下r mov start_flag_1,0 ;是r键,则将起始标志位清零 mov start_flag_2,0 mov arrive_flag,0 b3: call clearpicture ;擦除终点的小车 mov x,180 ;小车回到起始位置 mov y,83 call picture ;显示小车 jmp input b4: push ds mov dx,save_lc mov ax,save_lc+2 mov ds,ax mov al,1ch mov ah,25h int 21h ;重置之前的中断向量,调用lch pop ds mov ah,0 mov al,mode int 10h ;把显示器的模式设置为显示图形之前的模式 mov ax,4c00h ;返回dos int 21h ;*********************************************************************************************************************** ;显示9字型轨道 ;*********************************************************************************************************************** guidao_9 proc mov x1,190 mov y1,95 mov x2,135 mov y2,25 mov x3,215 mov y3,145 mov x4,135 call draw_9_line ;外轨道 mov x1,190 mov y1,80 ;轨道的入口 mov x2,150 mov y2,40 mov x3,200 mov y3,130 mov x4,135 ;轨道的出口 call draw_9_line ;内轨道 ret guidao_9 endp ;******************************画9字********************************** draw_9_line proc mov cx,x1 mov dx,y1 mov di,y2 mov si,x2 call hline call sline mov di,y3 mov si,x3 call hline call sline mov si,x4 call hline draw_9_line endp ;*********************画竖线********************** sline proc mov al,03h ;设置直线的颜色为青 mov bh,0 ;0页 mov ah,0ch cmp dx,di jg a1line aline: int 10h ;写图形象素,AL=01h象素值,BH=0页码,(CX、DX)=(0,0)图形坐标列(X)、行(Y) inc dx cmp dx,di ;判断是否到di行 jng aline ;没到,则画线 dec dx ;使下一个点与这一个点重合 jmp e3 a1line: int 10h dec dx cmp dx,di jnl a1line inc dx e3: ret ;到了,则退出 sline endp ;*********************画横线********************** hline proc mov al,03h ;设置直线的颜色为青 mov bh,0 ;0页 mov ah,0ch cmp cx,si jg b1line bline: int 10h ;写图形象素,AL=01h象素值,BH=0页码,(CX、DX)=(0,0)图形坐标列(X)、行(Y) inc cx ;画第一点,并让横坐标加一 cmp cx,si ;判断是否到si列 jng bline ;没到,则画线 dec cx ;使下一条线的起点与这一个点重合 jmp e2 b1line: int 10h ;写图形象素,AL=01h象素值,BH=0页码,(CX、DX)=(0,0)图形坐标列(X)、行(Y) dec cx cmp cx,si jnl b1line ;没到,则画线 inc cx ;使下一条线的起点与这一个点重合 e2: ret ;到了,则退出 hline endp ;*********************************************************************************************************************** ;显示小车(通过向图形显示缓冲区写点) ;*********************************************************************************************************************** picture proc near mov ax,es_save mov es,ax mov dx,y mov bx,0 again: cmp dx,0 je over add bx,320 dec dx jmp again ;找到小车第一个点所在行 over: mov dx,10 lea si,car next1: mov cx,10 mov di,x ;找到小车第一个点 next: mov al,[si] mov es:[bx+di],al ;往空位填写数据 inc si ;指向下一个待填入的数据 inc di ;指向下一个等待填写的空位 loop next add bx,320 ;转到下一行 dec dx jne next1 ret picture endp ;*********************************************************************************************************************** ;计时器(中断号为1ch的中断为计时器中断,每55ms中断一次,每秒发生18.2次中断) ;*********************************************************************************************************************** clint proc far push ax ;保护寄存器 push bx push cx push dx push si push di push bp push sp push ds push es mov bx,data mov ds,bx ;设置数据段 assume ds:data cmp arrive_flag,1 ;判断小车是否到达终点 jne e6 ;没到,则跳至e7 call disptime ;到达,则显示时间 jmp return ;返回 e6: lea bx,count inc word ptr[bx] ;每产生一次定时中断,count加1 cmp word ptr[bx],18 ;判断是否到1秒 jne e7 ;没到,则跳至e6 call inct ;调整时间 e7: mov al,start_flag_1 and al,start_flag_2 jnz e8 mov al,start_flag_1 or al,start_flag_2 jz return jmp e9 e8: mov count,0 mov sec,0 mov min,0 mov start_flag_2,0 e9: call disptime ;显示小车 return: pop es pop ds pop sp pop bp pop di pop si pop dx pop cx pop bx pop ax iret clint endp ;******************判断是否进位******************* inct proc near mov word ptr[bx],0 add bx,2 inc word ptr[bx] cmp word ptr[bx],60 jne exit call inct exit: ret inct endp ;*****************************显示时间******************************** disptime proc near mov ax,min call bindec mov dl,':' mov ah,02h int 21h mov ax,sec call bindec mov dl,':' mov ah,02h int 21h mov bx,count mov al,55d mul bl call bindec mov dl,0dh ;输出回车,让光标回到起点 mov ah,02h int 21h ret disptime endp ;************把一个三位十进制数显示出来*********** bindec proc near mov cx,100d call decdiv mov cx,10d call decdiv mov cx,1 call decdiv ret bindec endp ;********************显示高位********************* decdiv proc near mov dx,0 div cx push dx mov dl,al add dl,30h mov ah,02h int 21h ;显示一位 pop ax ret decdiv endp ;************************************************************************************************************************ ;擦除 ;************************************************************************************************************************ clearpicture proc near mov dx,y mov bx,0 again2: cmp dx,0 je over2 add bx,320 dec dx jmp again2 over2: mov dx,10 next12: mov cx,10 mov di,x next2: mov al,0 ;把该点置为0,即用黑色擦除该点 mov es:[bx+di],al inc di loop next2 add bx,320 dec dx jne next12 ret clearpicture endp ;*********************************************************************************************************************** ;延时程序 ;*********************************************************************************************************************** delay proc near push bx push cx mov bx,1234 back: mov cx,66 push ax wait1: in al,61h and al,10h cmp al,ah je wait1 mov ah,al loop wait1 pop ax dec bx jne back pop cx pop bx ret delay endp ;*********************************************************************************************************************** ;小车自动运行 ;*********************************************************************************************************************** xiaoche_move proc call picture ;转移至picture程序段 ag: mov ah,7 ;中断 int 21h cmp al,'s' ;设置开始键s jne ag ;判断是否为s,不是则转至ag中断 mov start_flag_1,1 mov start_flag_2,1 start1: call clearpicture dec x call picture call delay mov si,x cmp si,turn_x1 ;遇到第一个拐弯 jg start1 start2: call clearpicture dec y call picture call delay mov si,y cmp si,turn_y1 ;遇到第二个拐弯 jg start2 start3: call clearpicture inc x call picture call delay mov si,x cmp si,turn_x2 ;遇到第三个拐弯 jl start3 start4: call clearpicture inc y call picture call delay mov si,y cmp si,turn_y2 ;遇到第四个拐弯 jl start4 start5: call clearpicture dec x call picture call delay mov si,x cmp si,turn_x3 ;遇到第五个拐弯,即终点 jg start5 mov arrive_flag,1 ret xiaoche_move endp ;*********************************************************************************************************************** ;小车手动运行 ;*********************************************************************************************************************** xiaoche_shou proc j0: call clearpicture ;擦除小车 call saomiao ;键盘扫描 cmp start_flag_1,1 ;判断小车是否启动 jne a8 ;没有,则呆在原地不动 ;判断小车运动的方向 cmp direc_flag,1 ;上 jne a1 dec y a1: cmp direc_flag,2 ;下 jne a2 inc y a2: cmp direc_flag,3 ;左 jne a3 dec x a3: cmp direc_flag,4 ;右 jne a4 inc x a4: call ya_line_do ;检测是否碰到轨道 cmp touch_flag,1 jne a8 ;没有碰到轨道,则继续前进 call guidao_9 ;碰到则重新显示轨道 mov touch_flag,0 ;将触轨标志清零 call back_step ;小车后退一步,回到轨道 a8: call picture call delay cmp arrive_flag,1 ;判断小车是否到达终点,到了则退出 jne j0 a9: ret xiaoche_shou endp ;*********************************************************************************************************************** ;键盘扫描程序 ;*********************************************************************************************************************** saomiao proc near mov ah,01h ;从键盘读一个字符,读到的结果为键的扫描码,存放在AH中 int 16h jz f ;如果无键按下,则退出 mov ah,00h ;若有键按下则中断当前 int 16h cmp ax,1f73h ;s的扫描码 jne h mov start_flag_1,1 mov start_flag_2,1 mov direc_flag,0 mov arrive_flag,0 h: cmp ax,1474h ;t的扫描码 jne j mov start_flag_1,0 mov start_flag_2,1 k: call picture mov ah,0 int 16h cmp ax, 2e63h ;c的扫描码 jne k mov start_flag_1,1 mov start_flag_2,0 call clearpicture j: cmp ax,4800h ;上键的扫描码 jne a mov direc_flag,1 a: cmp ax,5000h ;下键的扫描码 jne b mov direc_flag,2 b: cmp ax,4b00h ;左键的扫描码 jne g mov direc_flag,3 g: cmp ax,4d00h ;右键的扫描码 jne f mov direc_flag,4 jmp f e1: mov al,mode ;一旦有按键输入,则把显示器的模式设置为画直线之前的模式 mov ah,0 int 10h mov ax,4c00h int 21h f: ret saomiao endp ;*********************************************************************************************************************** ;小车触轨判断及处理 ;*********************************************************************************************************************** ya_line_do proc mov ax,y2 mov bx,y1 mov cx,x2 call ya_y_line sub ax,x_d add bx,x_d sub cx,x_d call ya_y_line mov ax,y2 mov bx,y3 mov cx,x3 call ya_y_line sub ax,x_d add bx,x_d add cx,x_d call ya_y_line mov ax,x2 mov bx,x1 mov cx,y1 call ya_x_line sub ax,x_d add cx,x_d call ya_x_line mov ax,x2 mov bx,x3 mov cx,y2 call ya_x_line sub ax,x_d add bx,x_d sub cx,x_d call ya_x_line mov ax,x4 mov bx,x3 mov cx,y3 call ya_x_line add bx,x_d add cx,x_d call ya_x_line cmp touch_flag,1 je e4 mov ax,y3 ;判断是否到终点 mov bx,ax add bx,x_d mov cx,x4 call ya_y_line mov al,touch_flag mov arrive_flag,al e4: ret ya_line_do endp ;*****************判断是否触到y线***************** ya_y_line proc ;ax为y1(起点),bx为y2(终点),cx为x1 cmp x,cx je n3 mov dx,cx ;注意cx不能变化 sub dx,9 cmp x,dx jnz n1 n3: mov dx,ax sub dx,9 cmp y,dx jl n1 cmp y,bx jg n1 mov touch_flag,1 n1: ret ya_y_line endp ;*****************判断是否触到x线***************** ya_x_line proc ;ax为x1(起点),bx为x2(终点),cx为y1 cmp y,cx je n5 mov dx,cx ;注意cx不能变化 sub dx,9 cmp y,dx jnz n2 n5: mov dx,ax sub dx,9 cmp x,dx jl n2 cmp x,bx jg n2 mov touch_flag,1 n2: ret ya_x_line endp ;************************小车触轨则后退一步*************************** back_step proc cmp direc_flag,1 ;如果碰到轨道,则后退一步 jne a5 inc y a5: cmp direc_flag,2 jne a6 dec y a6: cmp direc_flag,3 jne a7 inc x a7: cmp direc_flag,4 jne a8 dec x ret back_step endp ;*********************************************************************************************************************** ;*********************************************************************************************************************** code ends end start ```
汇编语言屏幕总是闪烁
新手一枚正在学习汇编 输出的时候屏幕总是闪烁(屏幕操作位置不是特别懂) 另外这个程序的逻辑问题还有一些问题,望大神指教 DATA SEGMENT SHOW1 DB ' +--------------------------------------------------------------------------+',0DH,0AH,'$' SHOW2 DB ' | 1.INPUT NUMBER |',0DH,0AH,'$' SHOW3 DB ' | 2.2->10 NUMBER |',0DH,0AH,'$' SHOW4 DB ' | 3.COMPOSITOR NUMBER |',0DH,0AH,'$' SHOW5 DB ' | 4.MAX NUMBER |',0DH,0AH,'$' SHOW6 DB ' | 5.EXIT PROGRAM |',0DH,0AH,'$' SHOW7 DB ' +--------------------------------------------------------------------------+',0DH,0AH,'$' SHOW8 DB 0DH,0AH,'THE ','$' SHOW9 DB ' NUMBER IS :','$' SHOW10 DB 0DH,0AH,'$' SHOW11 DB 'MAX IS :','$' ILLEGAL DB 0DH,0AH,'Illegal character. Try again : $' NUM DW 10 DUP(0) NUM2 DW 0 MAX DW ? FLAG DB 0 SIGN1 DB ' ' SIGN2 DB '-' SIGN DB 30H LINE DB 7 ROW DB 0 DATA ENDS SHOW_MENU MACRO SHOW LEA DX,SHOW MOV AH,09H INT 21H ENDM stack segment stt dw 50 dup(?) stack ends CODE SEGMENT ASSUME CS:CODE,DS:DATA,SS:STACK START: MOV AX,DATA MOV DS,AX CALL SCREEN MOV AL,0 ;初始化 MOV BH,11110000B MOV CH,7 MOV CL,0 MOV DH,19H ;16ln MOV DL,4FH ;80col MOV AH,06H INT 10H MOV BH,0 MOV DH,7 ;光标第七行 MOV DL,0 MOV AH,02H INT 10H C0: MOV CX,2 MOV AH,01H INT 21H CMP AL,'1' JNZ C1 C1 : CMP AL,'2' JNZ C2 CALL OUTPUT_BY_10 MOV BL,7 CMP BL,18H JZ C2 INC LINE C2: CMP AL,'3' JNZ C3 CALL campare MOV BL,7 CMP BL,18H JZ C3 INC LINE C3: CMP AL,'4' JNZ C4 CALL PRO4 MOV BL,LINE CMP BL,18H JZ C4 INC LINE C4: CMP AL,'5' JMP EXIT0 EXIT0: MOV AH,4CH INT 21H ;/**************************************************************************/ input proc push ax push bx push cx push dx MOV CX,10 PUTNUM: JMP @READ ; @ERROR: ; LEA DX, ILLEGAL ; load and display the string ILLEGAL MOV AH, 9 INT 21H @READ: ; XOR BX, BX ; 清空 BX XOR CX, CX ; 清空 CX MOV AH, 1 ; INT 21H ; CMP AL, "-" ; compare AL with "-" JE @MINUS ; jump to label @MINUS if AL="-" CMP AL, "+" ; compare AL with "+" JE @PLUS ; jump to label @PLUS if AL="+" JMP @INPUT ; jump to label @INPUT @MINUS: ; MOV CX, 1 ; set CX=1 @PLUS: ; INT 21H ; read a character CMP AL, 0DH ; compare AL with CR JE @END ; jump to label @END if AL=CR @INPUT: ; CMP AL, 30H ; compare AL with 0 JL @ERROR ; jump to label @ERROR if AL<0 CMP AL, 39H ; compare AL with 9 JG @ERROR ; jump to label @ERROR if AL>9 AND AX, 000FH ; convert ascii to decimal code PUSH AX ; push AX onto the STACK MOV AX, 10 ; set AX=10 MUL BX ; set AX=AX*BX MOV BX, AX ; set BX=AX POP AX ; pop a value from STACK into AX ADD BX, AX ; set BX=AX+BX MOV AH, 1 ; set input function INT 21H ; read a character CMP AL, 0DH ; compare AL with CR JNE @INPUT ; jump to label if AL!=CR @END: ; OR CX, CX ; check CX is 0 or not JE @EXIT ; jump to label @EXIT if CX=0 NEG BX ; negate BX MOV SI,0 MOV BX,NUM[SI] ADD SI,2 LOOP PUTNUM @EXIT: ; CALL SCREEN pop dx pop cx pop bx pop ax RET input endp ;/**************************************************************************/ output_by_10 proc push ax push bx push cx push dx MOV CX,10 OUTPUT: MOV SI,0 MOV BX,NUM[SI] PUSH CX CMP BX, 0 ; compare BX with 0 JGE @START ; jump to label @START if BX>=0 MOV AH, 2 ; set output function MOV DL, "-" ; set DL='-' INT 21H ; print the character NEG BX ; take 2's complement of BX @START: ; jump label MOV AX, BX ; set AX=BX XOR CX, CX ; clear CX MOV BX, 10 ; set BX=10 @REPEAT: XOR DX, DX ; clear DX DIV BX ; divide AX by BX PUSH DX ; push DX onto the STACK INC CX ; increment CX OR AX, AX ; take OR of Ax with AX JNE @REPEAT ; jump to label @REPEAT if ZF=0 MOV AH, 2 ; set output function @DISPLAY: POP DX ; pop a value from STACK to DX OR DL, 30H ; convert decimal to ascii code INT 21H ; print a character LOOP @DISPLAY ; jump to label @DISPLAY if CX!=0 ADD SI,2 POP CX LOOP OUTPUT CALL SCREEN pop dx pop cx pop bx pop ax RET ; return output_by_10 endp ;/***********************************************************************/ campare PROC NEAR push ax push bx push cx push dx LEA DX,SHOW10 MOV AH,09H INT 21H MOV BL,LINE CMP BL,18H JZ LOOP5 INC LINE LOOP5: MOV CX,10 DEC CX AGAIN: MOV SI,0 PUSH CX NEXT9: MOV AX,NUM[SI] MOV BX,NUM[SI+2] CMP AX,BX JS NEXT10 XCHG AX,BX MOV NUM[SI],AX MOV NUM[SI+2],BX NEXT10: ADD SI,2 LOOP NEXT9 POP CX LOOP AGAIN CALL OUTPUT_BY_10 LEA DX,SHOW10 MOV AH,09H INT 21H MOV BL,LINE CMP BL,18H JZ LOOP6 INC LINE LOOP6: CALL SCREEN pop dx pop cx pop bx pop ax RET campare ENDP ;/*****************************************************************************/ PRO4 PROC NEAR push ax push bx push cx push dx LEA DX,SHOW10 MOV AH,09H INT 21H MOV BL,LINE CMP BL,18H JZ LOOP3 INC LINE LOOP3: LEA DX,SHOW11 MOV AH,09H INT 21H MOV CX,0AH MOV SI,0 MOV AX,NUM[SI] MOV MAX,AX NEXT11: MOV AX,NUM[SI] MOV BX,MAX CMP AX,BX JS NEXT12 MOV MAX,AX NEXT12: ADD SI,2 LOOP NEXT11 MOV AX,MAX TEST AX,8000H JZ ABC3 NEG AX PUSH AX MOV DL,SIGN2 ;输出负号 MOV AH,02H INT 21H POP AX ABC3: MOV BL,0AH DIV BL MOV DL,AH AND DX,00FFH PUSH DX INC NUM2 AND AX,00FFH CMP AX,0 JNZ ABC3 MOV CX,NUM2 ABC4: POP DX ADD DL,30H MOV AH,02H INT 21H LOOP ABC4 MOV NUM2,0 LEA DX,SHOW10 MOV AH,09H INT 21H MOV BL,LINE CMP BL,18H JZ LOOP4 INC LINE LOOP4: CALL SCREEN pop dx pop cx pop bx pop ax RET PRO4 ENDP ;/******************************************INIT SCREEN****************************/ SCREEN PROC NEAR push ax push bx push cx push dx MOV AL,0 MOV BH,11110000B MOV CH,0 MOV CL,0 MOV DH,6 MOV DL,4FH MOV AH,06H INT 10H MOV BH,0 MOV DH,0 MOV DL,0 MOV AH,02H INT 10H SHOW_MENU SHOW1 SHOW_MENU SHOW2 SHOW_MENU SHOW3 SHOW_MENU SHOW4 SHOW_MENU SHOW5 SHOW_MENU SHOW6 SHOW_MENU SHOW7 MOV BH,0 MOV DH,LINE MOV DL,0 MOV AH,02H INT 10H pop dx pop cx pop bx pop ax RET SCREEN ENDP CODE ENDS END START
求大神解释下c语言双重for循环的汇编语句??
void main(){ int i,j; for(i=0;i<5;i++){ printf("0"); for(j=0;j<2;j++){ printf("1"); } } } 汇编: main: .LFB24: pushl %ebp movl %esp, %ebp pushl %ebx andl $-16, %esp subl $16, %esp movl $5, %ebx .L3: movl $48, (%esp) call putchar movl $49, (%esp) call putchar movl $49, (%esp) call putchar subl $1, %ebx jne .L3 movl -4(%ebp), %ebx leave ret
大学四年自学走来,这些私藏的实用工具/学习网站我贡献出来了
大学四年,看课本是不可能一直看课本的了,对于学习,特别是自学,善于搜索网上的一些资源来辅助,还是非常有必要的,下面我就把这几年私藏的各种资源,网站贡献出来给你们。主要有:电子书搜索、实用工具、在线视频学习网站、非视频学习网站、软件下载、面试/求职必备网站。 注意:文中提到的所有资源,文末我都给你整理好了,你们只管拿去,如果觉得不错,转发、分享就是最大的支持了。 一、电子书搜索 对于大部分程序员...
【JSON解析】浅谈JSONObject的使用
简介 在程序开发过程中,在参数传递,函数返回值等方面,越来越多的使用JSON。JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,同时也易于机器解析和生成、易于理解、阅读和撰写,而且Json采用完全独立于语言的文本格式,这使得Json成为理想的数据交换语言。 JSON建构于两种结构: “名称/值”对的集合(A Collection of name/va...
程序员请照顾好自己,周末病魔差点一套带走我。
程序员在一个周末的时间,得了重病,差点当场去世,还好及时挽救回来了。
卸载 x 雷某度!GitHub 标星 1.5w+,从此我只用这款全能高速下载工具!
作者 | Rocky0429 来源 | Python空间 大家好,我是 Rocky0429,一个喜欢在网上收集各种资源的蒟蒻… 网上资源眼花缭乱,下载的方式也同样千奇百怪,比如 BT 下载,磁力链接,网盘资源等等等等,下个资源可真不容易,不一样的方式要用不同的下载软件,因此某比较有名的 x 雷和某度网盘成了我经常使用的工具。 作为一个没有钱的穷鬼,某度网盘几十 kb 的下载速度让我...
只因接了一个电话,程序员被骗 30 万!
今天想给大家说一个刚刚发生在我身边的一起真实的诈骗经历,我的朋友因此被骗走30万。注:为了保护当事人隐私,部分情节进行了修改。1平安夜突来的电话开始以为就像普通的诈骗一样,想办法让你把钱...
我一个37岁的程序员朋友
周末了,人一旦没有点事情干,心里就瞎想,而且跟几个老男人坐在一起,更容易瞎想,我自己现在也是 30 岁了,也是无时无刻在担心自己的职业生涯,担心丢掉工作没有收入,担心身体机能下降,担心突...
python自动下载图片
近日闲来无事,总有一种无形的力量萦绕在朕身边,让朕精神涣散,昏昏欲睡。 可是,像朕这么有职业操守的社畜怎么能在上班期间睡瞌睡呢,我不禁陷入了沉思。。。。 突然旁边的IOS同事问:‘嘿,兄弟,我发现一个网站的图片很有意思啊,能不能帮我保存下来提升我的开发灵感?’ 作为一个坚强的社畜怎么能说自己不行呢,当时朕就不假思索的答应:‘oh, It’s simple. Wait for me for a ...
一名大专同学的四个问题
【前言】   收到一封来信,赶上各种事情拖了几日,利用今天要放下工作的时机,做个回复。   2020年到了,就以这一封信,作为开年标志吧。 【正文】   您好,我是一名现在有很多困惑的大二学生。有一些问题想要向您请教。   先说一下我的基本情况,高考失利,不想复读,来到广州一所大专读计算机应用技术专业。学校是偏艺术类的,计算机专业没有实验室更不用说工作室了。而且学校的学风也不好。但我很想在计算机领...
复习一周,京东+百度一面,不小心都拿了Offer
京东和百度一面都问了啥,面试官百般刁难,可惜我全会。
Java 14 都快来了,为什么还有这么多人固守Java 8?
从Java 9开始,Java版本的发布就让人眼花缭乱了。每隔6个月,都会冒出一个新版本出来,Java 10 , Java 11, Java 12, Java 13, 到2020年3月份,...
达摩院十大科技趋势发布:2020 非同小可!
【CSDN编者按】1月2日,阿里巴巴发布《达摩院2020十大科技趋势》,十大科技趋势分别是:人工智能从感知智能向认知智能演进;计算存储一体化突破AI算力瓶颈;工业互联网的超融合;机器间大规模协作成为可能;模块化降低芯片设计门槛;规模化生产级区块链应用将走入大众;量子计算进入攻坚期;新材料推动半导体器件革新;保护数据隐私的AI技术将加速落地;云成为IT技术创新的中心 。 新的画卷,正在徐徐展开。...
轻松搭建基于 SpringBoot + Vue 的 Web 商城应用
首先介绍下在本文出现的几个比较重要的概念: 函数计算(Function Compute): 函数计算是一个事件驱动的服务,通过函数计算,用户无需管理服务器等运行情况,只需编写代码并上传。函数计算准备计算资源,并以弹性伸缩的方式运行用户代码,而用户只需根据实际代码运行所消耗的资源进行付费。Fun: Fun 是一个用于支持 Serverless 应用部署的工具,能帮助您便捷地管理函数计算、API ...
讲真,这两个IDE插件,可以让你写出质量杠杠的代码
周末躺在床上看《拯救大兵瑞恩》 周末在闲逛的时候,发现了两个优秀的 IDE 插件,据说可以提高代码的质量,我就安装了一下,试了试以后发现,确实很不错,就推荐给大家。 01、Alibaba Java 代码规范插件 《阿里巴巴 Java 开发手册》,相信大家都不会感到陌生,其 IDEA 插件的下载次数据说达到了 80 万次,我今天又贡献了一次。嘿嘿。 该项目的插件地址: https://github....
Python+OpenCV实时图像处理
目录 1、导入库文件 2、设计GUI 3、调用摄像头 4、实时图像处理 4.1、阈值二值化 4.2、边缘检测 4.3、轮廓检测 4.4、高斯滤波 4.5、色彩转换 4.6、调节对比度 5、退出系统 初学OpenCV图像处理的小伙伴肯定对什么高斯函数、滤波处理、阈值二值化等特性非常头疼,这里给各位分享一个小项目,可通过摄像头实时动态查看各类图像处理的特点,也可对各位调参、测试...
2020年一线城市程序员工资大调查
人才需求 一线城市共发布岗位38115个,招聘120827人。 其中 beijing 22805 guangzhou 25081 shanghai 39614 shenzhen 33327 工资分布 2020年中国一线城市程序员的平均工资为16285元,工资中位数为14583元,其中95%的人的工资位于5000到20000元之间。 和往年数据比较: yea...
为什么猝死的都是程序员,基本上不见产品经理猝死呢?
相信大家时不时听到程序员猝死的消息,但是基本上听不到产品经理猝死的消息,这是为什么呢? 我们先百度搜一下:程序员猝死,出现将近700多万条搜索结果: 搜索一下:产品经理猝死,只有400万条的搜索结果,从搜索结果数量上来看,程序员猝死的搜索结果就比产品经理猝死的搜索结果高了一倍,而且从下图可以看到,首页里面的五条搜索结果,其实只有两条才是符合条件。 所以程序员猝死的概率真的比产品经理大,并不是错...
害怕面试被问HashMap?这一篇就搞定了!
声明:本文以jdk1.8为主! 搞定HashMap 作为一个Java从业者,面试的时候肯定会被问到过HashMap,因为对于HashMap来说,可以说是Java集合中的精髓了,如果你觉得自己对它掌握的还不够好,我想今天这篇文章会非常适合你,至少,看了今天这篇文章,以后不怕面试被问HashMap了 其实在我学习HashMap的过程中,我个人觉得HashMap还是挺复杂的,如果真的想把它搞得明明白...
毕业5年,我问遍了身边的大佬,总结了他们的学习方法
我问了身边10个大佬,总结了他们的学习方法,原来成功都是有迹可循的。
python爬取百部电影数据,我分析出了一个残酷的真相
2019年就这么匆匆过去了,就在前几天国家电影局发布了2019年中国电影市场数据,数据显示去年总票房为642.66亿元,同比增长5.4%;国产电影总票房411.75亿元,同比增长8.65%,市场占比 64.07%;城市院线观影人次17.27亿,同比增长0.64%。 看上去似乎是一片大好对不对?不过作为一名严谨求实的数据分析师,我从官方数据中看出了一点端倪:国产票房增幅都已经高达8.65%了,为什...
推荐10个堪称神器的学习网站
每天都会收到很多读者的私信,问我:“二哥,有什么推荐的学习网站吗?最近很浮躁,手头的一些网站都看烦了,想看看二哥这里有什么新鲜货。” 今天一早做了个恶梦,梦到被老板辞退了。虽然说在我们公司,只有我辞退老板的份,没有老板辞退我这一说,但是还是被吓得 4 点多都起来了。(主要是因为我掌握着公司所有的核心源码,哈哈哈) 既然 4 点多起来,就得好好利用起来。于是我就挑选了 10 个堪称神器的学习网站,推...
这些软件太强了,Windows必装!尤其程序员!
Windows可谓是大多数人的生产力工具,集娱乐办公于一体,虽然在程序员这个群体中都说苹果是信仰,但是大部分不都是从Windows过来的,而且现在依然有很多的程序员用Windows。 所以,今天我就把我私藏的Windows必装的软件分享给大家,如果有一个你没有用过甚至没有听过,那你就赚了????,这可都是提升你幸福感的高效率生产力工具哦! 走起!???? NO、1 ScreenToGif 屏幕,摄像头和白板...
阿里面试,面试官没想到一个ArrayList,我都能跟他扯半小时
我是真的没想到,面试官会这样问我ArrayList。
曾经优秀的人,怎么就突然不优秀了。
职场上有很多辛酸事,很多合伙人出局的故事,很多技术骨干被裁员的故事。说来模板都类似,曾经是名校毕业,曾经是优秀员工,曾经被领导表扬,曾经业绩突出,然而突然有一天,因为种种原因,被裁员了,...
大学四年因为知道了这32个网站,我成了别人眼中的大神!
依稀记得,毕业那天,我们导员发给我毕业证的时候对我说“你可是咱们系的风云人物啊”,哎呀,别提当时多开心啦????,嗯,我们导员是所有导员中最帅的一个,真的???? 不过,导员说的是实话,很多人都叫我大神的,为啥,因为我知道这32个网站啊,你说强不强????,这次是绝对的干货,看好啦,走起来! PS:每个网站都是学计算机混互联网必须知道的,真的牛杯,我就不过多介绍了,大家自行探索,觉得没用的,尽管留言吐槽吧???? 社...
良心推荐,我珍藏的一些Chrome插件
上次搬家的时候,发了一个朋友圈,附带的照片中不小心暴露了自己的 Chrome 浏览器插件之多,于是就有小伙伴评论说分享一下我觉得还不错的浏览器插件。 我下面就把我日常工作和学习中经常用到的一些 Chrome 浏览器插件分享给大家,随便一个都能提高你的“生活品质”和工作效率。 Markdown Here Markdown Here 可以让你更愉快的写邮件,由于支持 Markdown 直接转电子邮...
【程序人生】程序员接私活常用平台汇总
00. 目录 文章目录00. 目录01. 前言02. 程序员客栈03. 码市04. 猪八戒网05. 开源众包06. 智城外包网07. 实现网08. 猿急送09. 人人开发10. 开发邦11. 电鸭社区12. 快码13. 英选14. Upwork15. Freelancer16. Dribbble17. Remoteok18. Toptal19. AngelList20. Topcoder21. ...
看完这篇HTTP,跟面试官扯皮就没问题了
我是一名程序员,我的主要编程语言是 Java,我更是一名 Web 开发人员,所以我必须要了解 HTTP,所以本篇文章就来带你从 HTTP 入门到进阶,看完让你有一种恍然大悟、醍醐灌顶的感觉。 最初在有网络之前,我们的电脑都是单机的,单机系统是孤立的,我还记得 05 年前那会儿家里有个电脑,想打电脑游戏还得两个人在一个电脑上玩儿,及其不方便。我就想为什么家里人不让上网,我的同学 xxx 家里有网,每...
史上最全的IDEA快捷键总结
现在Idea成了主流开发工具,这篇博客对其使用的快捷键做了总结,希望对大家的开发工作有所帮助。
阿里程序员写了一个新手都写不出的低级bug,被骂惨了。
这种新手都不会范的错,居然被一个工作好几年的小伙子写出来,差点被当场开除了。
谁是华为扫地僧?
是的,华为也有扫地僧!2020年2月11-12日,“养在深闺人不知”的华为2012实验室扫地僧们,将在华为开发者大会2020(Cloud)上,和大家见面。到时,你可以和扫地僧们,吃一个洋...
立即提问