- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我编写了一个 NASM 程序,并使用 nasm -f elf -l rs.lst rs.asm
从它创建了一个列表文件。该程序运行完美,接收一个键输入值,然后输出该值是控制键还是可打印键,以及它是数字、小写字母还是大写字母。
我需要帮助理解我在 .lst 文件中阅读的内容。左边的地址是数字吗?指示?它们代表内存吗?这是 .lst
。
1 segment .data
//Removed my student ID info
8 ;Program Output Strings
9
10 00000023 5072657373204B6579- askForKey: db 'Press Key and Enter: ', 10 ; ;10 is the newline value
11 0000002C 20616E6420456E7465-
12 00000035 723A200A
13 askLen: equ $-askForKey
14
15 00000039 436F6E74726F6C204B- controlKey: db 'Control Key ', 10
16 00000042 6579200A
17 controlLen: equ $-controlKey
18
19 00000046 5072696E7461626C65- printableKey: db 'Printable Key ', 10
20 0000004F 204B6579200A
21 printableLen: equ $-printableKey
22
23 00000055 446563696D616C204B- decimalKey: db 'Decimal Key ', 10
24 0000005E 6579200A
25 decimalLen: equ $-decimalKey
26
27 00000062 55707065722D636173- upperKey: db 'Upper-case Key ', 10
28 0000006B 65204B6579200A
29 upperLen: equ $-upperKey
30
31 00000072 4C6F7765722D636173- lowerKey: db 'Lower-case Key ', 10
32 0000007B 65204B6579200A
33 lowerLen: equ $-lowerKey
34
35 00000082 0A blankLine: db '', 10
36 blankLen: equ $-blankLine
37
38 segment .bss
39
40 00000000 <res 00000002> key resb 2
41
42 segment .text
43
44 global main
45 main:
46
47
48 00000000 B804000000 mov eax, 4 ; system call 4
49 00000005 BB01000000 mov ebx, 1 ; standard output
50 0000000A B9[00000000] mov ecx, studentInfo ; 'Program by Raphael Stein'
51 0000000F BA23000000 mov edx, infoLen
52 00000014 CD80 int 0x80
53
54 ;Program Begins
55
56 ; Ask for key input
57 00000016 B804000000 mov eax, 4 ; system call 4
58 0000001B BB01000000 mov ebx, 1 ; standard output
59 00000020 B9[23000000] mov ecx, askForKey ; 'Press key and Enter: '
60 00000025 BA16000000 mov edx, askLen
61 0000002A CD80 int 0x80
62 ; Take input
63 0000002C B803000000 mov eax, 3 ; system call 3 to get input
64 00000031 BB00000000 mov ebx, 0 ; standart input device
65 00000036 B9[00000000] mov ecx, key ; pointer to id
66 0000003B BA02000000 mov edx, 2 ; take in this many bytes
67 00000040 CD80 int 0x80
68
69
70
71 control: ; check if it's a control key
72 00000042 B120 mov cl, 32 ; space bar (32) is the first key after control keys
73 00000044 BB[00000000] mov ebx, key ;move the first 8bits of ebx for comparison
74 00000049 380B cmp byte [ebx], cl ; compare 32 and the value of key
75 0000004B 7D1B jge printable ; If the key is >=, it's a printable
76 0000004D B804000000 mov eax, 4
77 00000052 BB01000000 mov ebx, 1
78 00000057 B9[39000000] mov ecx, controlKey
79 0000005C BA0D000000 mov edx, controlLen
80 00000061 CD80 int 0x80
81 00000063 E9A0000000 jmp exit ; It's obviously not any of the other categories
82
83
84 printable: ; Tell that it's a printable symbol
85 00000068 B804000000 mov eax, 4
86 0000006D BB01000000 mov ebx, 1
87 00000072 B9[46000000] mov ecx, printableKey
88 00000077 BA0F000000 mov edx, printableLen
89 0000007C CD80 int 0x80
90
91 decimal:
92 0000007E B130 mov cl, 48 ; 0 (48) is the smallest decimal
93 00000080 BB[00000000] mov ebx, key ;move the first 8bits of ebx for comparison
94 00000085 380B cmp byte [ebx], cl
95 00000087 7C7F jl exit
96 00000089 B139 mov cl, 57 ; 9 (57) is the largest decimal
97 0000008B BB[00000000] mov ebx, key ;move the first 8bits of ebx for comparison
98 00000090 380B cmp byte [ebx], cl
99 00000092 7F18 jg uppercase ; if key is greater, jump to check if it's uppercase.
100 00000094 B804000000 mov eax, 4
101 00000099 BB01000000 mov ebx, 1
102 0000009E B9[55000000] mov ecx, decimalKey
103 000000A3 BA0D000000 mov edx, decimalLen
104 000000A8 CD80 int 0x80
105 000000AA EB5C jmp exit
106
107 uppercase:
108 000000AC B141 mov cl, 65 ; A (65) is the smallest smallest uppercase
109 000000AE BB[00000000] mov ebx, key ;move the first 8bits of ebx for comparison
110 000000B3 380B cmp byte [ebx], cl
111 000000B5 7C51 jl exit
112 000000B7 B15A mov cl, 90 ; Z (90) is the largest upper case
113 000000B9 BB[00000000] mov ebx, key ;move the first 8bits of ebx for comparison
114 000000BE 380B cmp byte [ebx], cl
115 000000C0 7F18 jg lowercase
116 000000C2 B804000000 mov eax, 4 ; If it IS an upper case key, print and then exit
117 000000C7 BB01000000 mov ebx, 1
118 000000CC B9[62000000] mov ecx, upperKey
119 000000D1 BA10000000 mov edx, upperLen
120 000000D6 CD80 int 0x80
121 000000D8 EB2E jmp exit
122
123
124 lowercase:
125 000000DA B161 mov cl, 97 ; a (97) is the smallest smallest uppercase
126 000000DC BB[00000000] mov ebx, key ;move the first 8bits of ebx for comparison
127 000000E1 380B cmp byte [ebx], cl
128 000000E3 7C23 jl exit ; If the key is less than 97 exit.
129 000000E5 B17A mov cl, 122 ; Z (90) is the largest upper case
130 000000E7 BB[00000000] mov ebx, key ;move the first 8bits of ebx for comparison
131 000000EC 380B cmp byte [ebx], cl
132 000000EE 7FEA jg lowercase
133 000000F0 B804000000 mov eax, 4 ; If it IS an upper case key, print and then exit
134 000000F5 BB01000000 mov ebx, 1
135 000000FA B9[72000000] mov ecx, lowerKey
136 000000FF BA10000000 mov edx, lowerLen
137 00000104 CD80 int 0x80
138 00000106 EB00 jmp exit
139
140 exit:
141 00000108 B804000000 mov eax, 4 ; system call 4
142 0000010D BB01000000 mov ebx, 1 ; standard output
143 00000112 B9[82000000] mov ecx, blankLine ; Print blank line before exiting
144 00000117 BA01000000 mov edx, blankLen
145 0000011C CD80 int 0x80
146
147 0000011E B801000000 mov eax, 1
148 00000123 31DB xor ebx, ebx
149 00000125 CD80 int 0x80
150
最佳答案
左边的数字是汇编器的二进制输出,与源代码行相关。
第一列是源代码行
第二列是地址或偏移量。例如,00000023
是提示标签 askForKey:
所在的地址。
第三列是二进制值。例如,如果您查看提示文本 Press
,它会直接转换为十六进制值 5072657373
52 00000014 CD80 int 0x80
读起来是这样的:
源代码第52行,偏移量00000014包含二进制值CD80,由指令INT 0x80编译。
您还可以看到旁边有一个地址的下一行是 57 00000016
,其中 16 来自之前的 14 + CD80 的 2 个字节
关于assembly - 如何读取 NASM 汇编程序 .lst 列表文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16154870/
我刚刚在学习 NASM,我有点想弄清楚这个问题。你如何在 NASM 中声明变量?例如,如何在 NASM 中声明 unsigned int i?谢谢 最佳答案 汇编语言中没有 unsigned int
我正在阅读这篇关于操作系统编程的精彩脚本 http://www.cs.bham.ac.uk/~exr/lectures/opsys/10_11/lectures/os-dev.pdf 第 12 页有一
我正在尝试使用 nasm 打印给我的程序的命令行参数: GLOBAL main EXTERN printf section .rodata fmt db "Argument: %s", 10, 0 s
这两种工具都将汇编指令直接翻译成机器代码,但是否有可能确定哪一种产生最快和最干净的代码? 最佳答案 当您使用汇编程序编写时,您准确地描述了生成 的说明所以它不依赖于汇编程序。这取决于你。您编写的助记符
代码: %define x 0x03 x equ 0x03 它们之间有什么区别? 最佳答案 %define是一种更强大的宏处理方式,类似于 C 预处理器。在您的简单情况下,使用 x 没有太大区
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 关闭 8 年前。 这个问题似乎是题外话,因为它缺乏足够的信息来诊断问题。更详细地描述您的问题或inclu
我目前正在关注 a tutorial on OS development ,其中包括对引导加载程序的讨论。 我的引导加载程序当前处于 16 位实模式,因此,我能够使用提供的 BIOS 中断(例如 VG
len: equ 2 len: db 2 它们是否相同,产生的标签可以代替2使用?如果不是,那么每种声明形式的优点或缺点是什么?它们可以互换使用吗? 最佳答案 第一个是equate,类似于C
我的循环有问题,其中包含的代码很长,它给了我错误“短跳超出范围”,所以我想知道是否有一种方法可以通过不减少来使循环工作其中代码量有多少? 示例1: label: my code LOOP la
在阅读了至少约4本关于汇编编程的不同书籍的前3或4章之后,我进入了一个阶段,可以使用MASM 6.11将“Hello World”放置在dosbox控制台上。想象一下我的喜悦! 我程序的第一个版本使用
我正在做一个项目,将我编写的子程序附加到老师包含的主文件中。他给了我们使我们的子程序成为全局性的说明,但显然我是个白痴。这两个 asm 文件在同一个文件夹中,我正在使用 nasm -f elf -g
我最近开始使用 NASM 程序集编写代码,但我的问题是我不知道如何以正确的方式访问结构元素。我已经在这个网站和谷歌上搜索了解决方案,但我看到到处都有人说不同的话。我的程序崩溃了,我感觉问题出在访问结构
我正在尝试从用户那里获取输入,然后我想根据用户输入的内容输出一些文本。 我的问题是出于某种原因,它总是认为它是 A,我不知道为什么。你可以在下面找到我的代码: bits 16
我熟悉 TASM 但不太熟悉 NASM。我读过 NASM 允许使用本地标签,这些标签在名称前用点表示。例如代码 .loop: ;some code jmp .loop 定义一个局部标号,
您将如何在寄存器上对 NASM 进行位移?我读了手册,似乎只提到了这些运算符 >> , > 和 >仅用于整数常量。这就是“标量值”的含义。您可以使用 shl 移位寄存器中的值或 shr指示。它们用于将
首先,这是一个家庭作业。 我有一个循环来分别获取两位数的值,并通过将第一个数字乘以 10 并与第二个数字相加得到一个整数来加入它们。 我正在做这一切并保存在我的AL注册,现在我想将该整数插入一个数组,
我一直在做基本的 NASM 编码,我想知道是否可以使用 NASM 模拟按键。如果是这样,怎么做? 如果重要的话,我正在使用 Ubuntu linux 10.04 和 Pentium R T4300 处
我可以在 NASM 中创建一个新标签,它指向一个新的内存位置,该位置与另一个标签指向的内存位置偏移几个字节。 例如:如果 label1 指向内存位置 0x40h,有没有办法使用 label1 定义指向
我需要设置一些标签地址/偏移量的最高位。 我试过: 测试.nasm: BITS 32 dw mylabel | 0x8000 mylabel: dd 0 但是当我尝试组装它时,我得到: nasm -f
如果能向我解释以下使用 printf、使用 nasm 和 gcc 编译的示例中发生了什么,我将不胜感激。为什么“sud”只打印在屏幕上?我也不明白,当我将“push 'sud'”与“push 'sud
我是一名优秀的程序员,十分优秀!